版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、表结构如下:goods(商品表)goodsid(商品id) goodsname(名称) typeid(分类-外键) supplierid(供应商-外键)type(分类表)typeid(id主键) typename(分类名称)supplier(供应商表)supplierid(id主键) suppliername( 供应商名称)你可建一个查询条件的类,里面包括你要查询的所有字段如: public class query private string suppliername; private string goodsname; private string typename;.get/set方法.
2、得到查询条件后,可以把此类的一个对象传入自己做的方法,此方法可以根据条件的个数及是否输入条件进行查询:public static list query_goods(query query) session session = sessionfactory.getsession(); criteria criteria = session.createcriteria(goods.class); criteria type = criteria.createcriteria("type"); criteria supplier= criteria.createcriteria
3、("supplier"); if(null!=query.getgoodsname() && !"".equels(query.getgoodsname() ) criteria.add(restrictions.like("goodsname","%"+query.getgoodsname()+"%"); if(null!=query.getsuppliername() && !"".equels(query.getsuppliername(
4、) ) supplier.add(restrictions.like("suppliername","%"+query.getsuppliername()+"%"); if(null!=query.gettypename() && !"".equels(query.gettypename() ) type.add(restrictions.like("typename","%"+query.gettypename+"%"); list li
5、st = criteria.list(); session.clear(); session.close(); return list; 以上方面还可多层的嵌套,如type里还有外键,可以按照以上方法进行嵌套。注意,查询时所有涉及到的数据都将一次性写入类的属性中,包括有关联的,即此时goods的关联延迟加载无效,我觉得这一点非常的好。呵呵,有什么好处,可以自己好好的想想。有许多人曾经提到过用example,就不用自己判断了,如果没有关联条件查询的话,确实是好,可它的缺点就是不能查询关联中的条件。 hibernate的多条件查询通用方法(查询条件个数不限,能进行模糊、精确2种查. /valuei
6、为第i个查询条件propertynamei的值 (本方法已通过测试)/*多条件查询,查询条件的值为空时自动除去该条件* rigor为true时采用精确查询*/public list searchbypropertys(string model,stringpropertyname,object value,int page,boolean rigor) stringbuffer sqlbuffer = new stringbuf
7、fer(); string ralation=" like " if(rigor) ralation=" = " sqlbuffer.append("from "+model+" as modeln"); int len=propertyname.length;
8、160; list list=new arraylist(); boolean first=true; for(int i=0;i<len;i+) if(valuei!=null) if(first) sqlbuffer.append(" where "+ "model."+
9、propertynamei + ralation+" ?n"); list.add(valuei); first=false; else sqlbuffer.append(" and "+ "model."+ pro
10、pertynamei +ralation+ " ?n"); list.add(valuei); try &
11、#160; session session=getsession(); query queryobject = session.createquery(sqlbuffer.tostring(); for(int i=0;i<list.size();i+)
12、160; if(rigor) queryobject.setparameter(i, list.get(i); else
13、 queryobject.setparameter(i, "%"+list.get(i)+"%");
14、 list=queryobject.list(); closesession(session); return list;
15、0; catch (runtimeexception re) log.error("find by property name failed", re); throw re; 通常使用的hibernate通常是三种:h
16、ql查询,qbc查询和qbe查询: 1、qbe(qurey by example)检索方式 qbe是最简单的,但是功能也是最弱的,qbe的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。qbe只支持=和like比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用hql检索方式或qbc检索方式。 java代码 /* * function 根据传递过来的object,分页显示在数据库中与其匹配的记录
17、* param pageno * 当前页数 * param pagesize * 每页显示的记录数 * param object * &
18、#160; 将查询条件封装为object * return 将查询结果封装为pager返回 */ public pager findpagebyexample(int pageno, int pagesize, object object) &
19、#160;pager pager = null; try criteria criteria = this.getsession().createcriteria(
20、0; class.forname(this.getentity(); if (object != null)
21、; criteria.add(example.create(object).enablelike(); / 获取根据条件分页查询的总行数 int
22、0;rowcount = (integer) criteria.setprojection( projections.rowcount().uniqueresult(); criteria.setprojection(null);
23、0; criteria.setfirstresult(pageno - 1) * pagesize); criteria.setmaxresults(pagesize);
24、;list result = criteria.list(); pager = new pager(pagesize, pageno, rowcount, result); catch (runtimeexception re) &
25、#160; throw re; finally return pager;
26、0; 注意代码的第20行,即criteria.add(example.create(object).enablelike();这一行,需将example.create(object)调用.enablelike()方法,不然不能模糊查询。 在bo层将需要模糊查询的列用"%"串起来,不然仍然和"="一样。 bo层代码: java代码 /* * function 将传递过来的参数封装成抢修人员bea
27、n,分页查询符合条件的记录 * param pageno * 当前的页码 * param pagesize * 每页显示的记录数 * param
28、mendname * 抢修人员的名称 * param specialty * 抢修人员的工种 * param post *
29、0; 抢修人员的职称 * return 将符合条件的记录数以及页码信息封装成pagerbean返回 */ public pager getinfobyquery(int pageno, int pagesize, string mendname,
30、0; string specialty, string post) eicmend eicmend = new eicmend(); if (mendname != null && mendname.length() > 0) &
31、#160; eicmend.setmendname("%" + mendname + "%"); if (specialty != null &&
32、;specialty.length() > 0) eicmend.setspecialty(specialty); if (post != null && post.lengt
33、h() > 0) eicmend.setpost(post); pager pager = erpmanagerdao
34、; .findpagebyexample(pageno, pagesize, eicmend); return pager; 执行sql语句如下: sql代码 hibernate: select count(*) as y0_ from yjzx.eic_mend
35、160;this_ where (this_.mendname like ? and this_.post like ?) hibernate: select * from ( select this_.mendid as mendid23_0_, this_.expertremark as expertr28_2
36、3_0_ from yjzx.eic_mend this_ where (this_.mendname like ? and this_.post like ?) ) where rownum <= ? 所以只需将需模糊查询的列用“%”链接即可。 2、qbc(qurey by criteria)检索方式 &
37、#160; 采用hql检索方式时,在应用程序中需要定义基于字符串形式的hql查询语句。qbc api提供了检索对象的另一种方式,它主要由criteria接口、criterion接口和restrictions接口组成,它支持在运行时动态生成查询语句。比较常见的是两种传参方式:一种是用map传参,另一种是用criterion不定参数传参。 map传参方式范例如下: dao层: java代码 /* * function 分页显示符合所有的记录数,将查询结果封装为pager *
38、;param pageno * 当前页数 * param pagesize * 每页显示的条数 * param map *
39、; 将查询条件封装为map * return 查询结果pager */ public pager findpagebycriteria(int pageno, int pagesize, map map) pager pager
40、60;= null; try criteria criteria = this.getsession().createcriteria(
41、0; class.forname(this.getentity(); if (map != null)
42、160;set<string> keys = map.keyset(); for (string key : keys)
43、160; criteria.add(restrictions.like(key, map.get(key);
44、160; / 获取根据条件分页查询的总行数 int rowcount = (integer) criteria.setprojection(
45、60;projections.rowcount().uniqueresult(); criteria.setprojection(null); criteria.setfirstresult(pageno - 1) * pagesize);
46、 criteria.setmaxresults(pagesize); list result = criteria.list(); pager = new pager(pagesize,
47、pageno, rowcount, result); catch (runtimeexception re) throw re; finally
48、160; return pager; map传参方式对应bo层代码: java代码 /* * function 将传递过来的参数封装成抢修人员bean,分页查询符合条件的记录 * para
49、m pageno * 当前的页码 * param pagesize * 每页显示的记录数 * param mendname *
50、60; 抢修人员的名称 * param specialty * 抢修人员的工种 * param post *
51、0; 抢修人员的职称 * return 将符合条件的记录数以及页码信息封装成pagerbean返回 */ public pager getinfobyquery2(int pageno, int pagesize, string mendname, string specialty,
52、;string post) map map = new hashmap(); if (mendname != null && mendname.length() > 0)
53、160; map.put("mendname", "%" + mendname + "%"); if (specialty != null && specialty.lengt
54、h() > 0) map.put("specialty", specialty); if (post != null && post.length
55、() > 0) map.put("post", post); pager pager = erpmanagerdao.findpagebycriteria(p
56、ageno, pagesize, map); return pager; 第二种方式:criterion不定参数传参方式。其代码如下所示: dao层代码: java代码 /* * function 分页显示符合所有的记录数,将查询结果封装为pager * param pageno *
57、; 当前页数 * param pagesize * 每页显示的条数 * param criterions *
58、0; 不定参数criterion * return 查询结果pager */ public pager findpagebycriteria(int pageno, int pagesize, criterion. criterions)
59、160; pager pager = null; try criteria criteria = this.getsession().createcriteria(
60、; class.forname(this.getentity(); if (criterions != null)
61、160; for (criterion criterion : criterions) if (criteri
62、on != null) criteria.add(criterion);
63、60;
64、60; / 获取根据条件分页查询的总行数 int rowcount = (integer) criteria.setprojection( projections.rowcount()
65、.uniqueresult(); criteria.setprojection(null); criteria.setfirstresult(pageno - 1) * pagesize); &
66、#160;criteria.setmaxresults(pagesize); list result = criteria.list(); pager = new pager(pagesize, pageno, rowcount,
67、60;result); catch (runtimeexception re) throw re; finally
68、60; return pager; criterion不定参数传参方式对应bo层代码: java代码 /* * function 将传递过来的参数封装成抢修人员bean,分页查询符合条件的记录 * param pageno
69、160; * 当前的页码 * param pagesize * 每页显示的记录数 * param mendname *
70、 抢修人员的名称 * param specialty * 抢修人员的工种 * param post * 抢
71、修人员的职称 * return 将符合条件的记录数以及页码信息封装成pagerbean返回 */ public pager getinfobyquery3(int pageno, int pagesize, string mendname, string specialty, string po
72、st) criterion criterion1 = null, criterion2 = null, criterion3 = null; if (mendname != null && mendname.length() > 0)
73、0; criterion1 = restrictions.ilike("mendname", mendname, matchmode.anywhere);
74、160; if (specialty != null && specialty.length() > 0) criterion2 = restriction
75、s.ilike("specialty", specialty, matchmode.exact); if (post != null &&am
76、p; post.length() > 0) criterion3 = restrictions.ilike("post", post, matchmode.exact);
77、 pager pager = erpmanagerdao.findpagebycriteria(pageno, pagesize, criterion1, criterion2, criterion3); return pager;
78、160; 3、hql检索方式 hql(hibernate query language)是面向对象的查询语言,它和sql查询语言有些相识。在hibernate提供的各种检索方式中,hql是使用最广的一种检索方式。 使用query接口分页查询dao代码: java代码 /* * function 分页显示符合所有的记录数,将查询结果封装为pager * param pageno * &
79、#160; 当前页数 * param pagesize * 每页显示的条数 * param instance *
80、160; 将查询条件封装为专家bean * return 查询结果pager */ public list<object> findpagebyquery(int pageno, int pagesize, string hql, map map)
81、; list<object> result = null; try query query = this.getsession().createquery(hql);
82、0; iterator it = map.keyset().iterator(); while (it.hasnext()
83、; object key = it.next(); query.setparameter(key.tostring(), map.get(key);
84、0; query.setfirstresult(pageno - 1) * pagesize); query.setmaxresults(pagesize); result = query.list();
85、60; catch (runtimeexception re) throw re; return result;
86、; 查询所有记录数的dao代码: java代码 /* * function 根据查询条件查询记录数的个数 * param hql * hql查询语句 * param map *
87、; 用map封装查询条件 * return 数据库中满足查询条件的数据的条数 */ public int gettotalcount(string hql, map map) try
88、; query query = this.getsession().createquery(hql); iterator it = map.keyset().iterator(); while (it
89、.hasnext() object key = it.next(); query.setparameter(key.t
90、ostring(), map.get(key); integer i = (integer) query.list().get(0); return i;
91、60; catch (runtimeexception re) throw re; bo层代码: java代码 /*
92、0;* function 将传递过来的参数封装成专家bean,分页查询符合条件的记录 * param pageno * 当前的页码 * param pagesize * 每页显示的记录数 * param expertname * 专家的名称 * param expertspecialty&
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 盐城工学院《会计专业导论》2025-2026学年期末试卷
- 伊春职业学院《形式逻辑》2025-2026学年期末试卷
- 中国矿业大学《安全系统工程》2025-2026学年期末试卷
- 泉州信息工程学院《小儿传染病》2025-2026学年期末试卷
- 闽西职业技术学院《工程招投标与合同管理》2025-2026学年期末试卷
- 部门联合消防安全检查
- “双减”工作主题班会教学设计
- 钼铁冶炼工班组考核强化考核试卷含答案
- 学校学生日常行为制度
- 煤焦油加氢制油工安全生产能力考核试卷含答案
- 2026贵州黔晟投资有限公司第一批社会招聘8人备考题库含答案详解(综合卷)
- 2026年医院医保精细化管理实施方案
- 非遗泥塑传承与创新:传统色彩·现代技艺·实践探索【课件文档】
- 2026年甘肃平凉市华亭煤业集团有限责任公司招聘笔试参考题库附带答案详解
- 城管队伍建设考核制度
- 地质勘查钻探作业安全风险分布图及分级管控“三清单”
- 充电站平台运营管理制度
- 2026年高级经济师宏观经济学实务操作题集
- 护理礼仪与沟通:构建和谐医患关系
- 2026年智能恒温花洒项目可行性研究报告
- 挖笋技术培训课件
评论
0/150
提交评论