关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法

原创 2006年05月29日 23:41:00
上篇文章:《今天发现一个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);
    }
希望大家多多交流

Hibernate Criteria 查询---addOrder用法添加排序

Hibernate Criteria 查询—addOrder用法添加排序 用于分页查询根据条件去查询~
  • qq_31776219
  • qq_31776219
  • 2016年08月29日 21:09
  • 3499

DetachedCriteria Criteria 使用方法

在常规的Web编程中,有大量的动态条件查询,即用户在网页上面自由选择某些条件,程序根据用户的选择条件,动态生成SQL语句,进行查询。比如,我记得在Facebook中可以选择高级查询条件,这个就是个动态...
  • u012881904
  • u012881904
  • 2016年05月03日 22:34
  • 4874

Hibernate - DetachedCriteria 的完整用法

最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法  设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。现...
  • u013380777
  • u013380777
  • 2016年06月28日 23:46
  • 561

DetachedCriteria多条件查询or,disjunction

public Page getCoordByPage(Page queryHandler, TCoordinate conditions) { DetachedCriteria dc = Deta...
  • xb12369
  • xb12369
  • 2014年10月17日 09:48
  • 12198

Hibernate - DetachedCriteria 的完整用法

最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法 设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。现在对 ...
  • kjfcpua
  • kjfcpua
  • 2009年06月21日 21:04
  • 70907

Hibernate中使用detachedCriteria.addOrder(Order.desc 错误 hibernate排序

文章转载自:http://blog.csdn.net/newfox/article/details/762447      原来开发的时候我是用的mysql,没有任何问题。原因就在最后面的order ...
  • hepeng154833488
  • hepeng154833488
  • 2011年07月18日 18:25
  • 5958

Hibernate - DetachedCriteria 的完整用法(带例子)

最近在项目中使用 Spring 和 Hibernate 进行开发,有感于 Criteria 比较好用,在查询方法设计上可以灵活的根据 Criteria 的特点来方便地进行查询条件的组装。现在对 Hib...
  • miqi770
  • miqi770
  • 2014年11月06日 16:10
  • 1291

DetachedCriteria.or 的使用问题

需求是这样的: select a,b
  • li346985170
  • li346985170
  • 2014年09月10日 11:15
  • 1027

【SSH快速进阶】——探索Hibernate对象的三种状态:Transient、Persistent、Detached

简单来说,处于Transient的对象,就是我们刚new出来、尚未被session管理的对象。它与数据库没有任何交集(数据库中没有与之对应的数据),可以被看做是携带信息的载体,可以对对象本身的属性、方...
  • huyuyang6688
  • huyuyang6688
  • 2015年10月12日 23:43
  • 1113

深入理解Hibernate持久化3种状态

学过hibernate的人都可能都知道hibernate有三种状态,transient(瞬时状态),persistent(持久化状态)以及detached(离线状态),大家伙也许也知道这三者之间的区别...
  • ls5718
  • ls5718
  • 2016年05月07日 16:41
  • 766
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于Hibernate的DetachedCriteria查询的addOrder问题的解决办法
举报原因:
原因补充:

(最多只允许输入30个字)