上篇文章:《
今天发现一个hibernate的bug,或者说一个应该注意的地方比较合适 》里面我提到了Hibernate查询需要注意的一个问题。今天发现了一个最好的解决办法。如果大家现在用Hibernate,相信大家都回用到DetachedCriteria.关于DetachedCriteria查询请查看
http://dev.yesky.com/241/2033241.shtml。
DetachedCriteria给我们的Hibernate查询带来了很多方便,但是如果你带上排序信息就会出现我的上一篇文章里面说的那种错误,今天发现一个很好的解决方法,其实也很简单。就是先把传入的带Order信息的DetachedCriteria去掉order信息查询数据总条数,然后再把Order加回来查询满足条件的对象。通过查看Hibernate的源代码发现Criteria的实现CriteriaImpl发现其实addOrder是给private List orderEntries = new ArrayList();这个List加值。这个List里面放的是OrderEntry对象。这个OrderEntry里面放了一个criteria 和 order.
public PaginationSupport findPageByCriteria(final DetachedCriteria detachedCriteria, final int pageSize, final int startIndex) {
return (PaginationSupport) getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException {
Criteria criteria = detachedCriteria.getExecutableCriteria(session);
CriteriaImpl impl = (CriteriaImpl) criteria;
List orderEntrys = new ArrayList();
try{
Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
//Get orders
orderEntrys = (List) field.get(impl);
//Remove orders
field.set(criteria,new ArrayList());
}catch(Exception ex){
ex.printStackTrace();
//TODO xxxx
}
int totalCount = ((Integer) criteria.setProjection(Projections.rowCount())
.uniqueResult()).intValue();
criteria.setProjection(null);
try{
Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
//Add orders return
for(int i=0; i<orderEntrys.size(); i++){
List innerOrderEntries = (List) field.get(criteria);
innerOrderEntries.add(orderEntrys.get(i));
}
}catch(Exception ex){
ex.printStackTrace();
//TODO cccc
}
List items = criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();
PaginationSupport ps = new PaginationSupport(items, totalCount, pageSize,
startIndex);
return ps;
}
}, true);
}
希望大家多多交流
分享到:
相关推荐
Hibernate - DetachedCriteria 的完整用法文档描述
DetachedCriteria的查询方式汇总
NULL 博文链接:https://chaoyi.iteye.com/blog/2152094
NULL 博文链接:https://rmn190.iteye.com/blog/379302
DetachedCriteria
DetachedCriteria使用介绍
使用 Hibernate Criteria && DetachedCriteria Queries演示Exists Clause非常简单的项目 安装 git clone https://github.com/RameshRM/hibernate-sample.git 跑步 mvn install 这是一个maven项目,依赖项是 ...
DetachedCriteria Criteria 使用方法 非常详细外加练习
下面小编就为大家带来一篇浅谈DetachedCriteria和Criteria的使用方法(必看)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结 果。 DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName(Name) 进行DetachedCriteria 实例的创建。
源文件 博文链接:https://kings008.iteye.com/blog/246773