`
somebody
  • 浏览: 81060 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
上篇文章:《今天发现一个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 使用DetachedCriteria操作

    **Hibernate 框架及其DetachedCriteria...以上就是关于Hibernate中DetachedCriteria的详细介绍,希望对你在理解和使用Hibernate进行数据库操作时有所帮助。在实践中不断探索和实践,你会发现更多使用技巧和优化策略。

    DetachedCriteria查询

    DetachedCriteria 是 Hibernate 中的一种离线查询对象,它可以在不依赖 Session 的情况下生成动态 SQL 语句并进行查询。下面是 DetachedCriteria 查询的详细知识点: 创建 DetachedCriteria 对象 DetachedCriteria...

    Hibernate的MySql查询.rar

    另外,Hibernate的 Criteria API 还可以配合DetachedCriteria使用,实现延迟加载(Lazy Loading),这对于处理大数据量时的性能优化至关重要。延迟加载允许我们在需要时才加载关联的对象,避免一次性加载大量数据...

    DetachedCriteria使用介绍

    `DetachedCriteria` 是 Hibernate 提供的一种灵活且强大的查询机制,它允许你在脱离 Session 的情况下构建复杂的查询标准,这意味着你可以提前构建查询标准,然后在任何地方执行查询,而无需关心当前是否有 Session...

    Hibernate 查询经典练习题

    在本文中,我们将探讨基于Hibernate的查询实践,包括HQL(Hibernate Query Language)和Criteria API的使用。我们将通过两个经典的练习题来深入理解这两个查询方式,并讨论它们在处理不同查询需求时的特点。 ### ...

    \Hibernate_query条件查询

    《Hibernate查询条件查询详解》 Hibernate作为Java领域中广受欢迎的对象关系映射(ORM)框架,极大地简化了数据库操作。其强大的查询能力是其核心功能之一。本篇将深入探讨Hibernate的条件查询,帮助开发者更好地...

    Hibernate的Criteria用法总结

    Criteria用于在线查询,直接与Hibernate Session关联,而DetachedCriteria则可在不依赖Session的情况下创建,适用于离线或延迟执行的查询。DetachedCriteria可以通过`forClass(Class)`或`forEntityName(String)`静态...

    Hibernate 在查询操作中要使用分页+命名参数+排序技术

    为解决这个问题,Hibernate提供了一种分页查询的方法。通过设置`firstResult`(起始索引)和`maxResults`(最大返回结果数)参数,我们可以指定每次查询的数据范围。例如,如果我们想要获取第5页,每页显示10条记录...

    Hibernate_Criteria条件查询数据

    10. **使用DetachedCriteria**:当查询条件在未来的某个时刻才确定时,可以先创建一个DetachedCriteria对象,然后在需要的时候再与Session关联并执行查询。 在实际开发中,Hibernate Criteria查询提供了很大的便利...

    Hibernate中Criteria的用法详解

    在Java的持久化框架Hibernate中,Criteria API是一个强大的查询工具,它可以用来构建动态和复杂的查询。Criteria API的主要优点在于它的灵活性,允许开发者在运行时构建查询,而不必预先定义HQL(Hibernate Query ...

    Hibernate中Criteria的完整用法

    Hibernate中的Criteria API是一种用于执行动态查询的机制,它允许开发者在运行时构建SQL查询,而无需直接编写SQL语句。Criteria API提供了更加面向对象的方式来处理数据库查询,这使得代码更易于理解和维护,尤其是...

    hibernate查询

    ### Hibernate 查询详解 #### 一、概述 在Java开发领域,Hibernate作为一种流行的持久层框架,提供了多种查询方式来实现对数据库的操作。本文将详细介绍Hibernate的几种主要查询方式,包括对象的状态变化、数据...

    Hibernate Criteria用法大全.docx

    在Criteria API中,可以通过`DetachedCriteria`创建离线查询,用于预编译查询,提高效率。子查询则可以通过`Subqueries`来实现。 总的来说,Hibernate Criteria API 提供了强大的查询功能,允许开发者以面向对象的...

    Hibernate Criteria 完全使用

    Hibernate Criteria API 提供了强大的、面向对象的查询方式,使得开发者可以方便地进行复杂的数据库操作,同时避免了SQL注入等安全问题。通过熟练掌握其用法,能够显著提高开发效率,增强代码的可读性和可维护性。 ...

    Criteria(hibernate3.0).rar_Criteria java_criteria Hibernate_hibe

    在Java持久化框架Hibernate中,Criteria API是一种强大的查询工具,它允许开发者以面向对象的方式构建SQL查询,从而避免了直接编写SQL语句的繁琐工作。Criteria API在Hibernate 3.0版本中得到了广泛应用,提供了更...

    Hibernate学习资料

    通过深入探讨Hibernate的Criteria API和`Restrictions`的使用,我们不仅掌握了如何构建复杂查询的能力,还了解了如何利用`DetachedCriteria`提高代码的可维护性和灵活性。这些技术在日常开发中极为实用,能够显著...

    Hibernate中Criteria的用法

    而在Hibernate提供的多种查询方式中,Criteria API是一种非常灵活且强大的查询工具,它支持复杂的条件组合以及分组、排序等功能,为开发者提供了更为方便的查询手段。 #### 二、Criteria简介 Criteria是Hibernate...

    Hibernate的Criteria用法

    Hibernate 3引入了`DetachedCriteria`,它允许你在不直接涉及Session的情况下构建查询条件。这有助于分离业务逻辑和数据访问层,使代码更易管理。创建DetachedCriteria的示例如下: ```java DetachedCriteria ...

    QBC的各种查询

    QBC,全称为Query By Criteria,是Java世界中一种基于对象的查询方式,主要用于简化Hibernate框架中的数据查询操作。QBC提供了一种面向对象的方式来构建查询条件,与SQL语句相比,它更易于理解和维护,尤其在处理...

    Hibernate中Criteria的使用

    本篇将详细探讨Hibernate中的Criteria API,这是一种灵活且强大的查询机制,用于执行动态查询。 Criteria API提供了一种类型安全的方式来构建SQL查询,避免了直接操作字符串造成的潜在错误。它的主要优点在于可以在...

Global site tag (gtag.js) - Google Analytics