上篇文章:《
今天发现一个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 );
}