如何使用HibernateTemplate进行分页功能
1个回答
2016-01-12 · 知道合伙人软件行家
关注
展开全部
在使用Hibernate时,可以用
query.setFirstResult(130);//设置取值的开始位置
query.setMaxResults(10); //设置读取数据的记录条数
方便的实现分页。
但是Spring 整合 Hibernate 时候用的 HibernateTemplate 却不支持分页,这样当查询记录过多时,就会给我们带来一些麻烦,因此需要自己包装一个类进行分页,具体实现如下:
使用spring的hibernateTemplate的回调机制扩展hibernateTemplate的功能实现分页。其中HibernateCallback()是一个接口,这种回调方式也是在java中常用的方法。
/**
*使用hql语句进行操作
*@paramhql 需要执行的hql语句
*@paramoffset 设置开始位置
*@paramlength 设置读取数据的记录条数
*@returnList 返回所需要的集合。
*/
public List getListForPage(final String hql, finalint offset,
finalint length) {
List list = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(hql);
query.setFirstResult(offset);
query.setMaxResults(length);
List list = query.list();
return list;
}
});
return list;
}
这样就实现了HibernateTemplate的分页,在实际编程中,代码还可以优化一下,把着色部分的代码再写成一个工具类,以后只用调用这个工具类中的方法就行了,把这个方法写成静态的,以后就可以不new对象就可以拿类名加方法名直接调用就可以了。下面就把优化的代码贴一下:
package com.huitu.khms.util;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateTemplate;
/**
*本工具类主要用来实现分页
*/
publicclass PageNoUtil {
/**
*@param session:一个会话
*@param hql:是需要执行的hql语句,
*@param offset设置开始位置
*@param length:读取记录条数
*return 返回结果集List<?>表示一个泛型的List
*/
publicstatic List<?> getList( Session session , String hql , intoffset, int length){
Query q = session.createQuery(hql);
q.setFirstResult(offset);
q.setMaxResults(length);
log.info(hql);
List<?> list = q.list();
log.info("取到的每页的size"+list.size());
return list;
}
}
因为这几行代码是每个分页功能都会用到的,这样每用到分页功能的时候就可以调用这个方法了,那上面分页功能的代码也可以精简为:
/**
*使用hql语句进行操作
*@paramhql 需要执行的hql语句
*@paramoffset 设置开始位置
*@paramlength 设置读取数据的记录条数
*@returnList 返回所需要的集合。
*/
public List getListForPage(final String hql, finalint offset,
finalint length) {
List list1 = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
List list2 = PageNoUtil. getList(session,hql,offset,length);
return list2;
}
});
return list1;
query.setFirstResult(130);//设置取值的开始位置
query.setMaxResults(10); //设置读取数据的记录条数
方便的实现分页。
但是Spring 整合 Hibernate 时候用的 HibernateTemplate 却不支持分页,这样当查询记录过多时,就会给我们带来一些麻烦,因此需要自己包装一个类进行分页,具体实现如下:
使用spring的hibernateTemplate的回调机制扩展hibernateTemplate的功能实现分页。其中HibernateCallback()是一个接口,这种回调方式也是在java中常用的方法。
/**
*使用hql语句进行操作
*@paramhql 需要执行的hql语句
*@paramoffset 设置开始位置
*@paramlength 设置读取数据的记录条数
*@returnList 返回所需要的集合。
*/
public List getListForPage(final String hql, finalint offset,
finalint length) {
List list = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
Query query = session.createQuery(hql);
query.setFirstResult(offset);
query.setMaxResults(length);
List list = query.list();
return list;
}
});
return list;
}
这样就实现了HibernateTemplate的分页,在实际编程中,代码还可以优化一下,把着色部分的代码再写成一个工具类,以后只用调用这个工具类中的方法就行了,把这个方法写成静态的,以后就可以不new对象就可以拿类名加方法名直接调用就可以了。下面就把优化的代码贴一下:
package com.huitu.khms.util;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateTemplate;
/**
*本工具类主要用来实现分页
*/
publicclass PageNoUtil {
/**
*@param session:一个会话
*@param hql:是需要执行的hql语句,
*@param offset设置开始位置
*@param length:读取记录条数
*return 返回结果集List<?>表示一个泛型的List
*/
publicstatic List<?> getList( Session session , String hql , intoffset, int length){
Query q = session.createQuery(hql);
q.setFirstResult(offset);
q.setMaxResults(length);
log.info(hql);
List<?> list = q.list();
log.info("取到的每页的size"+list.size());
return list;
}
}
因为这几行代码是每个分页功能都会用到的,这样每用到分页功能的时候就可以调用这个方法了,那上面分页功能的代码也可以精简为:
/**
*使用hql语句进行操作
*@paramhql 需要执行的hql语句
*@paramoffset 设置开始位置
*@paramlength 设置读取数据的记录条数
*@returnList 返回所需要的集合。
*/
public List getListForPage(final String hql, finalint offset,
finalint length) {
List list1 = getHibernateTemplate().executeFind(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException, SQLException {
List list2 = PageNoUtil. getList(session,hql,offset,length);
return list2;
}
});
return list1;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询