Hibernate
hibernate實現limit效果
- 由於hql語句內無法直接書寫limit語法,所以需要通過別的方式來達成這個效果
- limit效果一般需要有兩個參數:開始位置start和查詢數量num。兩個參數都是final int型
- 實現代碼如下:
try {
//首先新建一個final型的hql語句
final String hql="from xxb where xx="+xx+" order by xx asc ";
//hibernate執行查找,參數為請求返回方法
List<xx> xxList=getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session session){
//創建查找對象 ,設置起始位置以及查詢數量
Query query=session.createQuery(hql);
query.setFirstResult(start);
query.setMaxResults(num);
//轉換為list形式
return query.list();
}
});
return xxList;
}catch (RuntimeException e){
throw e;
}
- 對於實現過程中的兩個相關方法,截取其源碼貼在下方,也可以自行查看。
public List executeFind(HibernateCallback<?> action) throws DataAccessException {
Object result = this.doExecute(action, false, false);
if (result != null && !(result instanceof List)) {
throw new InvalidDataAccessApiUsageException("Result object returned from HibernateCallback isn't a List: [" + result + "]");
} else {
return (List)result;
}
}
public List<T> doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery(this.hql).setFirstResult(this.pageModel.getBeginIndex()).setMaxResults(this.pageModel.getPageSize());
if (!CollectionUtil.listIsNull(this.params)) {
for(int i = 0; i < this.params.size(); ++i) {
Object obj = this.params.get(i);
if (obj instanceof String) {
query.setString(i, (String)obj);
} else if (obj instanceof Integer) {
query.setInteger(i, (Integer)obj);
} else if (obj instanceof Date) {
query.setDate(i, (Date)obj);
}
}
}
List<T> list = query.list();
String counthql = "select count(*) " + this.hql;
Query countQuery = session.createQuery(counthql);
if (!CollectionUtil.listIsNull(this.params)) {
for(int i = 0; i < this.params.size(); ++i) {
Object obj = this.params.get(i);
if (obj instanceof String) {
countQuery.setString(i, (String)obj);
} else if (obj instanceof Integer) {
countQuery.setInteger(i, (Integer)obj);
} else if (obj instanceof Date) {
countQuery.setDate(i, (Date)obj);
}
}
}
List<Object> countList = countQuery.list();
if (CollectionUtil.listIsNull(countList)) {
this.pageModel.setTotalCount(0L);
} else {
this.pageModel.setTotalCount((Long)countList.get(0));
}
return list;
}