`
somebody
  • 浏览: 79917 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法

阅读更多
上篇文章:《今天发现一个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);
    }
希望大家多多交流

相关推荐

Global site tag (gtag.js) - Google Analytics