关于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 );
    }
希望大家多多交流
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值