关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法
2006-05-29 23:41
671 查看
上篇文章:《今天发现一个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);
}
希望大家多多交流
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);
}
希望大家多多交流
相关文章推荐
- 关于Hibernate在weblogic中使用查询的时候该页无法显示的问题解决
- hibernate一对多关联查询去重 criteria设置 解决分页条数不正确的问题
- 关于数据库查询语句SqlDataReader的连接释放问题的解决办法
- 关于 DetachedCriteria 查询问题
- 关于hibernate的n+1问题以及解决办法
- 关于hibernate查询视图时,相同主键的两条记录映射问题【已解决】
- Hibernate中多表联合查询遇到的问题(原生态的SQL语句解决办法)
- Hibernate使用原生SQL多表查询时字段名相同导致查询数据覆盖问题解决办法
- 关于Hibernate中fatch=eager的bag集合(一个java List)使用Criteria查询出现重复记录的问题
- Hibernate3 中一个不能查询与插入中文字符的问题解决办法
- 关于Hibernate 查询语句中文乱码问题的解决
- hibernate中Criteria的DISTINCT查询问题的解决方法
- 关于hibernate查询视图时,相同主键的两条记录映射问题【已解决】
- DetachedCriteria 解决BaseDao分页查询和排序问题
- hibernate关于criteria多表查询问题
- hibernate级联查询执行n+1次sqlt语句问题(内含解决办法,优化方式)
- Hibernate查询视图返回null问题说明及解决办法
- 关于WORD提示“Word无法创建工作文件,请检查临时环境变量”问题的解决办法
- 关于修改当前WiFi的账号和密码之后自动重连问题(不用在输入密码),重连时间过长问题的解决办法
- 关于MJRefresh下拉刷新崩溃问题及解决办法