| 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); }希望大家多多交流 |
|
|