您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > hibernate分页及多条件查询
表结构如下:goods(商品表)goodsid(商品id)goodsname(名称)typeid(分类-外键)supplierid(供应商-外键)type(分类表)typeid(id主键)typename(分类名称)supplier(供应商表)supplierid(ID主键)suppliername(供应商名称)你可建一个查询条件的类,里面包括你要查询的所有字段如:publicclassQuery{privateStringsuppliername;privateStringgoodsname;privateStringtypename;..................get/set方法................}得到查询条件后,可以把此类的一个对象传入自己做的方法,此方法可以根据条件的个数及是否输入条件进行查询:publicstaticListquery_goods(Queryquery){Sessionsession=SessionFactory.getSession();Criteriacriteria=session.createCriteria(Goods.class);Criteriatype=criteria.createCriteria(type);Criteriasupplier=criteria.createCriteria(supplier);if(null!=query.getGoodsname()&&!.equels(query.getGoodsname()))criteria.add(Restrictions.like(goodsname,%+query.getGoodsname()+%));if(null!=query.getSuppliername()&&!.equels(query.getSuppliername()))supplier.add(Restrictions.like(suppliername,%+query.getSuppliername()+%));if(null!=query.getTypename()&&!.equels(query.getTypename()))type.add(Restrictions.like(typename,%+query.getTypename+%));Listlist=criteria.list();session.clear();session.close();returnlist;}以上方面还可多层的嵌套,如type里还有外键,可以按照以上方法进行嵌套。注意,查询时所有涉及到的数据都将一次性写入类的属性中,包括有关联的,即此时goods的关联延迟加载无效,我觉得这一点非常的好。呵呵,有什么好处,可以自己好好的想想。有许多人曾经提到过用Example,就不用自己判断了,如果没有关联条件查询的话,确实是好,可它的缺点就是不能查询关联中的条件。Hibernate的多条件查询通用方法(查询条件个数不限,能进行模糊、精确2种查...//value[i]为第i个查询条件propertyName[i]的值(本方法已通过测试)/*多条件查询,查询条件的值为空时自动除去该条件*rigor为true时采用精确查询*/publicListsearchByPropertys(Stringmodel,String[]propertyName,Object[]value,intpage,booleanrigor){StringBuffersqlBuffer=newStringBuffer();Stringralation=like;if(rigor){ralation==;}sqlBuffer.append(from+model+asmodel\n);intlen=propertyName.length;Listlist=newArrayList();booleanfirst=true;for(inti=0;ilen;i++){if(value[i]!=null){if(first){sqlBuffer.append(where+model.+propertyName[i]+ralation+?\n);list.add(value[i]);first=false;}else{sqlBuffer.append(and+model.+propertyName[i]+ralation+?\n);list.add(value[i]);}}}try{Sessionsession=getSession();QueryqueryObject=session.createQuery(sqlBuffer.toString());for(inti=0;ilist.size();i++){if(rigor){queryObject.setParameter(i,list.get(i));}else{queryObject.setParameter(i,%+list.get(i)+%);}}list=queryObject.list();closeSession(session);returnlist;}catch(RuntimeExceptionre){log.error(findbypropertynamefailed,re);throwre;}}通常使用的Hibernate通常是三种:hql查询,QBC查询和QBE查询:1、QBE(QureyByExample)检索方式QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。Java代码/***@function根据传递过来的Object,分页显示在数据库中与其匹配的记录*@parampageNo*当前页数*@parampageSize*每页显示的记录数*@paramobject*将查询条件封装为Object*@return将查询结果封装为Pager返回*/publicPagerfindPageByExample(intpageNo,intpageSize,Objectobject){Pagerpager=null;try{Criteriacriteria=this.getSession().createCriteria(Class.forName(this.getEntity()));if(object!=null){criteria.add(Example.create(object).enableLike());}//获取根据条件分页查询的总行数introwCount=(Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();criteria.setProjection(null);criteria.setFirstResult((pageNo-1)*pageSize);criteria.setMaxResults(pageSize);Listresult=criteria.list();pager=newPager(pageSize,pageNo,rowCount,result);}catch(RuntimeExceptionre){throwre;}finally{returnpager;}}注意代码的第20行,即criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。在BO层将需要模糊查询的列用%%串起来,不然仍然和=一样。BO层代码:Java代码/***@function将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录*@parampageNo*当前的页码*@parampageSize*每页显示的记录数*@parammendName*抢修人员的名称*@paramspecialty*抢修人员的工种*@parampost*抢修人员的职称*@return将符合条件的记录数以及页码信息封装成PagerBean返回*/publicPagergetInfoByQuery(intpageNo,intpageSize,StringmendName,Stringspecialty,Stringpost){EicMendeicMend=newEicMend();if(mendName!=null&&mendName.length()0){eicMend.setMendname(%+mendName+%);}if(specialty!=null&&specialty.length()0){eicMend.setSpecialty(specialty);}if(post!=null&&post.length()0){eicMend.setPost(post);}Pagerpager=erpManagerDao.findPageByExample(pageNo,pageSize,eicMend);returnpager;}执行SQL语句如下:Sql代码Hibernate:selectcount(*)asy0_fromYJZX.EIC_MENDthis_where(this_.MENDNAMElike?andthis_.POSTlike?)Hibernate:select*from(selectthis_.MENDIDasMENDID23_0_,……this_.EXPERTREMARKasEXPERTR28_23_0_fromYJZX.EIC_MENDthis_where(this_.MENDNAMElike?andthis_.POSTlike?))whererownum=?所以只需将需模糊查询的列用“%%”链接即可。2、QBC(QureyByCriteria)检索方式采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBCAPI提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Restrictions接口组成,它支持在运行时动态生成查询语句。比较常见的是两种传参方式:一种是用map传参,另一种是用Criterion…不定参数传参。Map传参方式范例如下:DAO层:Java代码/***@function分页显示符合所有的记录数,将查询结果封装为Pager*@parampageNo*当前页数*@parampageSize*每页显示的条数*@parammap*将查询条件封装为map*@return查询结果Pager*/publicPagerfindPageByCriteria(intpageNo,intpageSize,Mapmap){Pagerpager=null;try{Criteriacriteria=this.getSession().createCriteria(Class.forName(this.getEntity()));if(map!=null){SetStringkeys=map.keySet();for(Stringkey:keys){criteria.add(Restrictions.like(key,map.get(key)));}}//获取根据条件分页查询的总行数introwCount=(Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();criteria.setProjection(null);criteria.setFirstResult((pageNo-1)*pa
本文标题:hibernate分页及多条件查询
链接地址:https://www.777doc.com/doc-2876291 .html