java hibernate 分页查询_Hibernate分页查询小结

/**

* @function 根据传递过来的Object,分页显示在数据库中与其匹配的记录

* @param pageNo

* 当前页数

* @param pageSize

* 每页显示的记录数

* @param object

* 将查询条件封装为Object

* @return 将查询结果封装为Pager返回

*/

public Pager findPageByExample(int pageNo, int pageSize, Object object)

{

Pager pager = null;

try

{

Criteria criteria = this.getSession().createCriteria(

Class.forName(this.getEntity()));

if (object != null)

{

criteria.add(Example.create(object).enableLike());

}

// 获取根据条件分页查询的总行数

int rowCount = (Integer) criteria.setProjection(

Projections.rowCount()).uniqueResult();

criteria.setProjection(null);

criteria.setFirstResult((pageNo - 1) * pageSize);

criteria.setMaxResults(pageSize);

List result = criteria.list();

pager = new Pager(pageSize, pageNo, rowCount, result);

} catch (RuntimeException re)

{

throw re;

} finally

{

return pager;

}

}

注意代码的第20行,即criteria.add(Example.create(object).enableLike());这一行,需将Example.create(object)调用.enableLike()方法,不然不能模糊查询。

在BO层将需要模糊查询的列用"%%"串起来,不然仍然和"="一样。

BO层代码:

/**

* @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录

* @param pageNo

* 当前的页码

* @param pageSize

* 每页显示的记录数

* @param mendName

* 抢修人员的名称

* @param specialty

* 抢修人员的工种

* @param post

* 抢修人员的职称

* @return 将符合条件的记录数以及页码信息封装成PagerBean返回

*/

public Pager getInfoByQuery(int pageNo, int pageSize, String mendName,

String specialty, String post)

{

EicMend eicMend = new EicMend();

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);

}

Pager pager = erpManagerDao

.findPageByExample(pageNo, pageSize, eicMend);

return pager;

}

执行SQL语句如下:

Hibernate: select count(*) as y0_ from YJZX.EIC_MEND this_ where

(this_.MENDNAME like ? and this_.POST like ?)

Hibernate: select * from ( select this_.MENDID as MENDID23_0_, ……

this_.EXPERTREMARK as EXPERTR28_23_0_ from YJZX.EIC_MEND this_ where

(this_.MENDNAME like ? and this_.POST like ?) ) where rownum <= ?

所以只需将需模糊查询的列用“%%”链接即可。

2、QBC(Qurey By Criteria)检索方式

采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Restrictions接口组成,它支持在运行时动态生成查询语句。比较常见的是两种传参方式:一种是用map传参,另一种是用Criterion…不定参数传参。

Map传参方式范例如下:

DAO层:

/**

* @function 分页显示符合所有的记录数,将查询结果封装为Pager

* @param pageNo

* 当前页数

* @param pageSize

* 每页显示的条数

* @param map

* 将查询条件封装为map

* @return 查询结果Pager

*/

public Pager findPageByCriteria(int pageNo, int pageSize, Map map)

{

Pager pager = null;

try

{

Criteria criteria = this.getSession().createCriteria(

Class.forName(this.getEntity()));

if (map != null)

{

Set keys = map.keySet();

for (String key : keys)

{

criteria.add(Restrictions.like(key, map.get(key)));

}

}

// 获取根据条件分页查询的总行数

int rowCount = (Integer) criteria.setProjection(

Projections.rowCount()).uniqueResult();

criteria.setProjection(null);

criteria.setFirstResult((pageNo - 1) * pageSize);

criteria.setMaxResults(pageSize);

List result = criteria.list();

pager = new Pager(pageSize, pageNo, rowCount, result);

} catch (RuntimeException re)

{

throw re;

} finally

{

return pager;

}

}

Map传参方式对应BO层代码:

/**

* @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录

* @param pageNo

* 当前的页码

* @param pageSize

* 每页显示的记录数

* @param mendName

* 抢修人员的名称

* @param specialty

* 抢修人员的工种

* @param post

* 抢修人员的职称

* @return 将符合条件的记录数以及页码信息封装成PagerBean返回

*/

public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName,

String specialty, String post)

{

Map map = new HashMap();

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);

}

Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize, map);

return pager;

}

第二种方式:Criterion…不定参数传参方式。其代码如下所示:

DAO层代码:

/**

* @function 分页显示符合所有的记录数,将查询结果封装为Pager

* @param pageNo

* 当前页数

* @param pageSize

* 每页显示的条数

* @param criterions

* 不定参数Criterion

* @return 查询结果Pager

*/

public Pager findPageByCriteria(int pageNo, int pageSize,

Criterion... criterions)

{

Pager pager = null;

try

{

Criteria criteria = this.getSession().createCriteria(

Class.forName(this.getEntity()));

if (criterions != null)

{

for (Criterion criterion : criterions)

{

if (criterion != null)

{

criteria.add(criterion);

}

}

}

// 获取根据条件分页查询的总行数

int rowCount = (Integer) criteria.setProjection(

Projections.rowCount()).uniqueResult();

criteria.setProjection(null);

criteria.setFirstResult((pageNo - 1) * pageSize);

criteria.setMaxResults(pageSize);

List result = criteria.list();

pager = new Pager(pageSize, pageNo, rowCount, result);

} catch (RuntimeException re)

{

throw re;

} finally

{

return pager;

}

}

Criterion…不定参数传参方式对应BO层代码:

/**

* @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录

* @param pageNo

* 当前的页码

* @param pageSize

* 每页显示的记录数

* @param mendName

* 抢修人员的名称

* @param specialty

* 抢修人员的工种

* @param post

* 抢修人员的职称

* @return 将符合条件的记录数以及页码信息封装成PagerBean返回

*/

public Pager getInfoByQuery3(int pageNo, int pageSize, String mendName,

String specialty, String post)

{

Criterion criterion1 = null, criterion2 = null, criterion3 = null;

if (mendName != null && mendName.length() > 0)

{

criterion1 = Restrictions.ilike("mendname", mendName,

MatchMode.ANYWHERE);

}

if (specialty != null && specialty.length() > 0)

{

criterion2 = Restrictions.ilike("specialty", specialty,

MatchMode.EXACT);

}

if (post != null && post.length() > 0)

{

criterion3 = Restrictions.ilike("post", post, MatchMode.EXACT);

}

Pager pager = erpManagerDao.findPageByCriteria(pageNo, pageSize,

criterion1, criterion2, criterion3);

return pager;

}

3、HQL检索方式

HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。

使用Query接口分页查询DAO代码:

/**

* @function 分页显示符合所有的记录数,将查询结果封装为Pager

* @param pageNo

* 当前页数

* @param pageSize

* 每页显示的条数

* @param instance

* 将查询条件封装为专家Bean

* @return 查询结果Pager

*/

public List findPageByQuery(int pageNo, int pageSize, String hql,

Map map)

{

List result = null;

try

{

Query query = this.getSession().createQuery(hql);

Iterator it = map.keySet().iterator();

while (it.hasNext())

{

Object key = it.next();

query.setParameter(key.toString(), map.get(key));

}

query.setFirstResult((pageNo - 1) * pageSize);

query.setMaxResults(pageSize);

result = query.list();

} catch (RuntimeException re)

{

throw re;

}

return result;

}

查询所有记录数的DAO代码:

/**

* @function 根据查询条件查询记录数的个数

* @param hql

* hql查询语句

* @param map

* 用map封装查询条件

* @return 数据库中满足查询条件的数据的条数

*/

public int getTotalCount(String hql, Map map)

{

try

{

Query query = this.getSession().createQuery(hql);

Iterator it = map.keySet().iterator();

while (it.hasNext())

{

Object key = it.next();

query.setParameter(key.toString(), map.get(key));

}

Integer i = (Integer) query.list().get(0);

return i;

} catch (RuntimeException re)

{

throw re;

}

}

BO层代码:

/**

* @function 将传递过来的参数封装成专家Bean,分页查询符合条件的记录

* @param pageNo

* 当前的页码

* @param pageSize

* 每页显示的记录数

* @param expertName

* 专家的名称

* @param expertSpecialty

* 专家的专业类别

* @param post

* 专家的行政职位

* @return 将符合条件的记录数以及页码信息封装成PagerBean返回

*/

public Pager getInfoByQuery(int pageNo, int pageSize, String expertName,

String expertSpecialty, String post)

{

StringBuffer hql = new StringBuffer();

hql.append("select count(expertid) from EicExpert where 1=1 ");

Map map = new HashMap();

if (expertName != null && expertName.length() > 0)

{

map.put("expertname", "%" + expertName + "%");

hql.append("and expertname like :expertname ");

}

if (expertSpecialty != null && expertSpecialty.length() > 0)

{

map.put("expertspecialty", expertSpecialty);

hql.append("and expertspecialty like :expertspecialty ");

}

if (post != null && post.length() > 0)

{

map.put("post", post);

hql.append("and post like :post ");

}

String queryHql = hql.substring(22);

List result = erpManagerDao.findPageByQuery(pageNo, pageSize,

queryHql, map);

int rowCount = erpManagerDao.getTotalCount(hql.toString(), map);

Pager pager = new Pager(pageSize, pageNo, rowCount, result);

return pager;

}

注:Pager类是我封装的一个分页类,包含 每页显示记录数,当前页,总记录数,每页显示数据的集合。因无关紧要,没有贴出来。另外我不知道Query接口有没有类似于Criteria那样可以直接在分页查询记录的同时查询出总记录条数,知道的大虾麻烦告诉下哈。在BO里设置不定参数的时候感觉也不太好,不知道大虾们可有比较好的办法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值