hibernate分页.docx
《hibernate分页.docx》由会员分享,可在线阅读,更多相关《hibernate分页.docx(35页珍藏版)》请在冰豆网上搜索。
hibernate分页
通常使用的Hibernate通常是三种:
hql查询,QBC查询和QBE查询:
1、QBE(QureyByExample)检索方式
QBE是最简单的,但是功能也是最弱的,QBE的功能不是特别强大,仅在某些场合下有用。
一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。
QBE只支持=和like比较运算符,无法不大区间值,及其或的匹配。
在这种情况下,还是采用HQL检索方式或QBC检索方式。
Java代码
1./**
2. * @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录
3. * @param pageNo
4. * 当前页数
5. * @param pageSize
6. * 每页显示的记录数
7. * @param object
8. * 将查询条件封装为Object
9. * @return 将查询结果封装为Pager返回
10. */
11.public Pager findPageByExample(int pageNo, int pageSize, Object object)
12.{
13. Pager pager = null;
14. try
15. {
16. Criteria criteria = this.getSession().createCriteria(
17. Class.forName(this.getEntity()));
18.
19. if (object !
= null)
20. {
21. criteria.add(Example.create(object).enableLike());
22. }
23.
24. // 获取根据条件分页查询的总行数
25. int rowCount = (Integer) criteria.setProjection(
26. Projections.rowCount()).uniqueResult();
27. criteria.setProjection(null);
28.
29. criteria.setFirstResult((pageNo - 1) * pageSize);
30. criteria.setMaxResults(pageSize);
31.
32. List result = criteria.list();
33.
34. pager = new Pager(pageSize, pageNo, rowCount, result);
35.
36. } catch (RuntimeException re)
37. {
38. throw re;
39. } finally
40. {
41. return pager;
42. }
43.
44.}
/**
*@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代码
1./**
2. * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
3. * @param pageNo
4. * 当前的页码
5. * @param pageSize
6. * 每页显示的记录数
7. * @param mendName
8. * 抢修人员的名称
9. * @param specialty
10. * 抢修人员的工种
11. * @param post
12. * 抢修人员的职称
13. * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
14. */
15.public Pager getInfoByQuery(int pageNo, int pageSize, String mendName,
16. String specialty, String post)
17.{
18.
19. EicMend eicMend = new EicMend();
20. if (mendName !
= null && mendName.length() > 0)
21. {
22. eicMend.setMendname("%" + mendName + "%");
23. }
24. if (specialty !
= null && specialty.length() > 0)
25. {
26. eicMend.setSpecialty(specialty);
27. }
28. if (post !
= null && post.length() > 0)
29. {
30. eicMend.setPost(post);
31. }
32.
33. Pager pager = erpManagerDao
34. .findPageByExample(pageNo, pageSize, eicMend);
35. return pager;
36.}
/**
*@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代码
1.Hibernate:
select count(*) as y0_ from YJZX.EIC_MEND this_ where
2.(this_.MENDNAME like ?
and this_.POST like ?
)
3.
4.Hibernate:
select * from ( select this_.MENDID as MENDID23_0_, ……
5.this_.EXPERTREMARK as EXPERTR28_23_0_ from YJZX.EIC_MEND this_ where
6.(this_.MENDNAME like ?
and this_.POST like ?
) ) where rownum <= ?
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代码
1./**
2. * @function 分页显示符合所有的记录数,将查询结果封装为Pager
3. * @param pageNo
4. * 当前页数
5. * @param pageSize
6. * 每页显示的条数
7. * @param map
8. * 将查询条件封装为map
9. * @return 查询结果Pager
10. */
11.public Pager findPageByCriteria(int pageNo, int pageSize, Map map)
12.{
13. Pager pager = null;
14. try
15. {
16. Criteria criteria = this.getSession().createCriteria(
17. Class.forName(this.getEntity()));
18.
19. if (map !
= null)
20. {
21. Set keys = map.keySet();
22. for (String key :
keys)
23. {
24. criteria.add(Restrictions.like(key, map.get(key)));
25. }
26. }
27.
28. // 获取根据条件分页查询的总行数
29. int rowCount = (Integer) criteria.setProjection(
30. Projections.rowCount()).uniqueResult();
31. criteria.setProjection(null);
32.
33. criteria.setFirstResult((pageNo - 1) * pageSize);
34. criteria.setMaxResults(pageSize);
35.
36. List result = criteria.list();
37.
38. pager = new Pager(pageSize, pageNo, rowCount, result);
39.
40. } catch (RuntimeException re)
41. {
42. throw re;
43. } finally
44. {
45. return pager;
46. }
47.
48.}
/**
*@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)
{
Setkeys=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)*pageSize);
criteria.setMaxResults(pageSize);
Listresult=criteria.list();
pager=newPager(pageSize,pageNo,rowCount,result);
}catch(RuntimeExceptionre)
{
throwre;
}finally
{
returnpager;
}
}
Map传参方式对应BO层代码:
Java代码
1./**
2. * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
3. * @param pageNo
4. * 当前的页码
5. * @param pageSize
6. * 每页显示的记录数
7. * @param mendName
8. * 抢修人员的名称
9. * @param specialty
10. * 抢修人员的工种
11. * @param post
12. * 抢修人员的职称
13. * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
14. */
15.public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName,
16. String specialty, String post)
17.{
18.
19. Map map = new HashMap();
20.
21. if (mendName !
= null && mendName.length() > 0)
22. {
23. map.put("mendname", "%" + mendName + "%");
24. }
25. if (specialty !
= null && specialty.length() > 0)
26. {
27. map.put("specialty", specialty);
28. }
29. if (post !
= null && post.length() > 0)
30. {
31. map.put("post", post);
32. }
33.
34. Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, map);
35. return pager;
36.}
/**
*@function将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
*@parampageNo
*当前的页码
*@parampageSize
*每页显示的记录数
*@parammendName
*抢修人员的名称
*@paramspecialty
*抢修人员的工种
*@parampost
*抢修人员的职称
*@return将符合条件的记录数以及页码信息封装成PagerBean返回
*/
publicPagergetInfoByQuery2(intpageNo,intpageSize,StringmendName,
Stringspecialty,Stringpost)
{
Mapmap=newHashMap();
if(mendName!
=null&&mendName.length()>0)
{
map.put("mendname","%"+mendName+"%");
}
if(specialty!
=null&&specialty.length()>0)
{
map.put("specialty",specialty);
}
if(post!
=null&&post.length()>0)
{
map.put("post",post);
}
Pagerpager=erpManagerDao.findPageByCriteria(pageNo,pageSize,map);
returnpager;
}
第二种方式:
Criterion…不定参数传参方式。
其代码如下所示:
DAO层代码:
Java代码