一般数据库实现分页,都是传一个起始数据和每页展示的数据的,想到使用mysql的limit关键字就可以查询,如下:
select * FROM ceshi
limit 1,10
这样的确可以实现查询指定范围内的数据,要是使用hibernate的离线多条件查询的话,如果使用DetachedCriteria的sqlRestriction,添加查询条件的话,会报错,如下sql语句:
// 由于条件是组合一起的,所以有可能有些条件是为空的,需要判断是否为空,拼接不同的sql語句
// 动态拼接sql语句查询,当条件为null,也会继续执行
Session session = getCurrentSession();
DetachedCriteria dc = DetachedCriteria.forClass(RetireInfor.class);
Criteria criteria = dc.getExecutableCriteria(session);
if (pageSize > 0) {
// Integer[] pages = { new Integer(start), new Integer(pageSize) };
Type[] types = { StandardBasicTypes.INTEGER,
StandardBasicTypes.INTEGER };
queryString += " limit ?,? ";
dc.add(Restrictions.sqlRestriction("LIMIT ?,?", pages, types));//这里会在后台报错,说无法识别limit
}
上述的错误,百度了一下,说是hibernate无法识别limit,有一种方法,使用Criteria,设置开始的数据和最大数据,如下代码:
// 由于条件是组合一起的,所以有可能有些条件是为空的,需要判断是否为空,拼接不同的sql語句
// 动态拼接sql语句查询,当条件为null,也会继续执行
Session session = getCurrentSession();
DetachedCriteria dc = DetachedCriteria.forClass(RetireInfor.class);
Criteria criteria = dc.getExecutableCriteria(session);
if (pageSize > 0) {
// Integer[] pages = { new Integer(start), new Integer(pageSize) };
// Type[] types = { StandardBasicTypes.INTEGER,
// StandardBasicTypes.INTEGER };
// // queryString += " limit ?,? ";
// dc.add(Restrictions.sqlRestriction("LIMIT ?,?", pages, types));
criteria.setFirstResult(start); // 开始记录
criteria.setMaxResults(pageSize); // 查询多少条
}
Criteria c = dc.getExecutableCriteria(session);
List<RetireInfor> list = null;
try {
list = c.list();
} catch (Exception e) {
LogUtil.error(e);
}
这样就可以实现分页的功能,离线多条件查询功能。版权声明:本文为omayyouhappy原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。