关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法
来源:互联网 发布:江宁广电网络营业厅 编辑:程序博客网 时间:2024/05/22 10:10
上篇文章:《今天发现一个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.
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);
}
希望大家多多交流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查询的addOrder问题的解决办法
- postgresql上Hibernate的DetachedCriteria同时添加addOrder和Projections.rowCount()运行出错。
- 灵活使用Hibernate的查询对象DetachedCriteria
- 灵活使用Hibernate的查询对象DetachedCriteria
- 灵活使用Hibernate的查询对象DetachedCriteria
- hibernate中DetachedCriteria查询的用法
- Hibernate的Criteria和DetachedCriteria 查询
- Hibernate的动态条件查询DetachedCriteria
- hibernate DetachedCriteria中的查询语句的使用
- 关于条件查询detachedCriteria的一点体会
- hibernate 的DetachedCriteria用法
- 关于 DetachedCriteria 查询问题
- 基于Hibernate的动态查询(HQL、Criteria、DetachedCriteria、MySQL)
- Hibernate(基础一) Hibernate3的动态条件查询DetachedCriteria用法
- Hibernate中DetachedCriteria的使用
- Hibernate 的QBC语法 DetachedCriteria !~
- Hibernate中DetachedCriteria的使用
- Hibernate中DetachedCriteria的使用
- 使用XSL的@显示元素的属性
- 封装回调函数——为对象方法(Object Method,参数中带this指针的函数) 构造 普通函数(参数中无this指针的函数)形式 的入口
- 最小堆应用---用最小堆实现huffman树
- c#学习读书笔记《2》
- HTML结构化:实践DIV+CSS网页布局入门指南
- 关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法
- 标准化开启互联互通
- C++的虚基类与java的多态性
- C++中的虚函数(virtual function) (细节,决定成败)
- DW 创建 模板小技巧 By Stabx
- xml快学完了,再次感受到java的世界的庞大
- Access 视图 查询优化过程例 By Stabx
- 晨星老大给c++学习者的书目
- Internet Explorer 编程简述(十二)正确地设置和转移焦点