hibernate分页及多条件查询_第1页
hibernate分页及多条件查询_第2页
hibernate分页及多条件查询_第3页
hibernate分页及多条件查询_第4页
hibernate分页及多条件查询_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论