本站首页    管理页面    写新日志    退出


«November 2025»
1
2345678
9101112131415
16171819202122
23242526272829
30


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7660413
建立时间:2006年5月29日




[Hibernate]关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法
软件技术,  电脑与网络

lhwork 发表于 2006/6/15 11:06:32

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


阅读全文(2328) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.711 second(s), page refreshed 144795670 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号