`
thinktank
  • 浏览: 60727 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于hibernate用DetachedCriteria实现查询的一点解决方案

阅读更多

        当我们用DetachedCriteria实现动态查询的时候,发现在使用它的时候有一点小小的缺陷,经过认真分析找出一点解决方法希望能帮助正在思考中的人。
       因为在分页查询的时候我们一般要做两步操作,一是返回满足条件的记录数,二是返回满足条件的记录。
返回满足条件的记录数很简单,一条语句即可搞定
count=(Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();
但该条语句执行后,我发现DetachedCriteria对象的Projection就被改变从而在查询记录的时候得到的结果集已被改变。网上有也说将criteria.setProjection(null);设置后即可,但对于多表关联查询却不管用,查询一两次后又出现了上面所说的问题。
下面,我列出我的解决方法以供参考

得到查询条件的DetachedCriteria对象:
private DetachedCriteria getDetachedCriteria(HttpServletRequest request){
   String discountTypeKey = Util.isNull(request.getParameter("discountTypeKey"));
   String configLibKey = Util.isNull(request.getParameter("configLibKey"));
   String baseUnit = Util.isNull(request.getParameter("baseUnit"));
   String beginDate = Util.isNull(request.getParameter("beginDate"));
   String endDate = Util.isNull(request.getParameter("endDate"));
   String options = Util.isNull(request.getParameter("options"));
   String temp = Util.isNull(request.getParameter("money"));
   temp=temp.equals("")?"0":temp;
   double money =  Double.parseDouble(temp);

   final DetachedCriteria detachedCriteria = DetachedCriteria.forClass(ChargeProcess.class);
   detachedCriteria.createAlias("discountInfoKey", "di");

   if(!discountTypeKey.equals("0")){
    detachedCriteria.add(Restrictions.eq("di.discountTypeKey.discountTypeID",discountTypeKey));
   }
   if(!configLibKey.equals("0")){
    detachedCriteria.add(Restrictions.eq("di.configLibKey.configLibID",configLibKey));
   }
   if(!baseUnit.equals("0")){
    detachedCriteria.add(Restrictions.eq("di.baseUnit",baseUnit));
   }
   if(!beginDate.equals("")){
    detachedCriteria.add(Restrictions.ge("operDate",Util.toDate(beginDate)));
   }
   if(!endDate.equals("")){
    detachedCriteria.add(Restrictions.lt("operDate",Util.toDate(endDate)));
   }
   if(!options.equals("0") && money>0){
    if(options.equals("1")){//=
     detachedCriteria.add(Restrictions.eq("money",new Double(money)));
    }
    if(options.equals("2")){//>
     detachedCriteria.add(Restrictions.gt("money",new Double(money)));
    }
    if(options.equals("3")){//>=
     detachedCriteria.add(Restrictions.ge("money",new Double(money)));
    }
    if(options.equals("4")){//<
     detachedCriteria.add(Restrictions.lt("money",new Double(money)));
    }
    if(options.equals("5")){//<=
     detachedCriteria.add(Restrictions.le("money",new Double(money)));
    }
   }
   detachedCriteria.add(Restrictions.eq("di.discountUserKey.discountUserID",discountUserKey));
   detachedCriteria.add(Restrictions.eq("this.status","0"));
  }
  return dcondition;
 }

 根据detachedCriteria对象返回该条件的记录数:
 public int getChargeProcessCount(final DetachedCriteria detachedCriteria) throws Exception{
  Integer count =new Integer(0);
  if(detachedCriteria!=null){
    count=(Integer) getHibernateTemplate().execute(new HibernateCallback() {
          public Object doInHibernate(Session session) throws HibernateException {
              Criteria criteria = detachedCriteria.getExecutableCriteria(session);
              CriteriaImpl impl = (CriteriaImpl) criteria;
              Projection projection = impl.getProjection();//取出projection
              List orderEntries = new ArrayList();//用来存放排序字段
              Field field = null;
              Integer count=new Integer(0);
              try {
                 field = CriteriaImpl.class.getDeclaredField("orderEntries");
                     field.setAccessible(true);
                     orderEntries = (List) field.get(impl);//将对象中的排序字段存入数组中
                     field.set(criteria,new ArrayList());//将排序字段设置为空

                     count=(Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();

                     criteria.setProjection(projection);//重新设置回projection
                 if (projection == null) criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
                 field.set(criteria,orderEntries);//重新设置回排序字段
              }catch (Exception e) {}

              return count;
          }
   },true);
  }
  return count.intValue();
 }

根据detachedCriteria对象返回结果集:
经过上面的查询后,我们的projection与排序字段都没有改变,接下来我们查询结果集时就没阻碍了
public List getChargeProcessReport(int startNumber,int maxNumber,final DetachedCriteria detachedCriteria,String field,String order){
   final int beginNumber=startNumber,endNumber=maxNumber;
   final String fd=Util.isNull(field),or=Util.isNull(order);
   return (List) getHibernateTemplate().execute(new HibernateCallback() {
         public Object doInHibernate(Session session) throws HibernateException {
             Criteria criteria = detachedCriteria.getExecutableCriteria(session);

             if(!fd.equals("") && !or.equals("")){
               try{
                     Field field = CriteriaImpl.class.getDeclaredField("orderEntries");
                     field.setAccessible(true); 

                    field.set(criteria,new ArrayList());

                 }catch(Exception ex){
                  System.out.println(ex.getMessage());
                 }
                 if(or.equals("desc")) criteria.addOrder(Order.desc(fd));//重新设置排序条件
                 if(or.equals("asc")) criteria.addOrder(Order.asc(fd));
                }

              List list =null;
              if(beginNumber==0 && endNumber==0){
               list = criteria.list();//不分页返回结果集
              }else{
               list = criteria.setFirstResult(beginNumber).setMaxResults(endNumber).list();
              }
              criteria.setFirstResult(0).setMaxResults(1000);//这里必须重新设置一次,否下次调用时会出错,至于什么原因我也还没有弄清楚,希望搞定的朋友能回复一下
             return list;
         }
     }, true);
 }
 到此已全部完成,希望对朋友们有所帮助,呵呵!

分享到:
评论
3 楼 xb12369 2013-03-05  
有没有办法结果集合 和 数量一次查询就返回呢 ..?
2 楼 csjxing 2008-01-29  
有没有办法结果集合 和 数量一次查询就返回呢 ..?
1 楼 csjxing 2008-01-29  
有没有办法结果集合 和 数量一次查询就返回呢 ..?

相关推荐

    Hibernate 使用DetachedCriteria操作

    Hibernate 是一个开源的对象关系映射(ORM)框架,它提供了数据访问和事务处理的解决方案,通过将业务对象与数据库表之间的映射关系自动化,避免了繁琐的SQL编写和结果集的遍历。它支持JPA规范,并且拥有自己的API,...

    hibernate程序高手秘笈-英文版

    《Hibernate: A Developer's Notebook》是一本专为深入理解Hibernate技术而编写的英文版指南,适合已经具备一定...书中的实战案例和解决方案将帮助你解决在开发过程中可能遇到的问题,让你成为Hibernate的真正高手。

    hibernate-release-5.2.3.Final

    Hibernate,作为Java领域中广泛使用的对象关系映射(ORM)框架,为开发者提供了方便的数据持久化解决方案。本文将针对"hibernate-release-5.2.3.Final"这一版本进行深入探讨,帮助读者掌握其核心特性和实际应用。 1...

    《精通Hibernate》电子版(孙卫琴)

    Hibernate是一款开源的Object-Relational Mapping(ORM)框架,它为Java开发者提供了强大的数据持久化解决方案,将复杂的数据库操作转化为对Java对象的操作,简化了数据库应用的开发。Hibernate通过映射XML文件或...

    hibernate开发包

    **Hibernate 开发包详解** Hibernate 是一款开源的 Java 平台上的对象关系映射(ORM)框架,它允许开发者将数据库操作与业务逻辑...无论是初学者还是经验丰富的开发者,都能从中受益,快速实现高质量的 ORM 解决方案。

    hibernate-release-5.4.17.Final.zip

    此版本的发布,旨在为开发者提供更稳定、可靠的ORM解决方案。 二、核心特性 1. 支持JPA 2.2:此版本完全兼容Java Persistence API (JPA) 2.2规范,包括新的注解、查询语言扩展等。 2. 优化的缓存策略:5.4.17....

    Hibernate3.1API.rar

    总结,Hibernate3.1 API提供了一整套完善的ORM解决方案,涵盖了数据库的配置、对象的映射、查询语言、事务管理以及性能优化等多个方面。深入理解和掌握这些知识点,将有助于Java开发者高效地进行数据库操作,提高...

    Hibernate全部笔记

    **Hibernate 全部笔记**...总之,Hibernate作为Java ORM框架的代表,为开发者提供了强大而灵活的数据持久化解决方案。掌握Hibernate,不仅可以提高开发效率,也能更好地理解和管理数据库事务,是Java开发者的必备技能。

    hibernate3.2-中文帮助文档

    1. **Hibernate 概述**:文档首先介绍了Hibernate的核心概念,包括持久化、对象关系映射以及Hibernate如何作为解决方案来简化数据访问层的开发。这部分会解释ORM的基本原理,以及Hibernate如何将Java对象与数据库表...

    Hibernate3.2中文手册

    Hibernate作为一个开源的ORM解决方案,使得Java开发者能够轻松地在Java应用程序中处理数据库操作,避免了直接编写SQL语句的繁琐工作。 本手册涵盖的主要内容包括: 1. **Hibernate简介**:介绍Hibernate的基本概念...

    hibernate帮助文档中+英

    Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射(ORM)解决方案,使得在Java应用程序中操作数据库变得更加便捷。本压缩包包含了Hibernate的中文和英文官方参考文档,是学习和掌握...

    Hibernate3.1_DOC_CN

    - ORM概念:Hibernate是Java平台上的一种ORM解决方案,它通过映射Java类到数据库表,使得对象与数据库交互变得更加简单。 - Hibernate3.1版本:这是Hibernate的一个重要版本,带来了许多改进和新特性,比如对JPA的...

    hibernate API

    SSH框架结合了Spring的依赖注入、Struts的MVC架构以及Hibernate的对象关系映射能力,为开发者提供了强大而全面的Web应用解决方案。 Hibernate是一个开放源代码的对象关系映射(ORM)框架,它允许开发者使用面向对象...

    Hibernate开发指南PDF

    总之,Hibernate 是一个强大的 ORM 解决方案,能够简化 Java 应用程序的数据库操作。通过学习 Hibernate,开发者可以更加专注于业务逻辑,而不是底层的 SQL 编程。本指南将帮助你理解和掌握 Hibernate 的关键概念,...

    hibernate电子书

    除此之外,本书还会探讨Hibernate的缓存机制,包括一级缓存和二级缓存,以及第三方缓存解决方案如 EhCache 和 Infinispan 的集成。缓存可以显著提高数据读取速度,减少数据库压力。 最后,书中会介绍一些高级主题,...

    hibernate项目开发

    Hibernate是Java平台上的一个开源ORM解决方案,它实现了Java对象和数据库记录之间的映射,使得开发者可以使用Java对象进行数据库操作。其核心理念在于,通过XML或注解定义对象与表之间的映射关系,进而实现对象的...

    Hibernate-3.2-API-EN.rar

    Hibernate是一个强大的开源对象关系映射(ORM)框架,它为Java开发者提供了数据持久化的解决方案。这个压缩包“Hibernate-3.2-API-EN.rar”包含了Hibernate 3.2版本的API文档,是英文版的资料,对于深入理解和使用...

    Hibernate学习笔记

    Hibernate作为Java领域中广泛使用的ORM解决方案,它极大地简化了数据库操作,将复杂的SQL语句与Java代码解耦,提高了开发效率和代码可维护性。 这篇学习笔记涵盖了以下核心知识点: 1. **Hibernate概述**:介绍...

    Hibernate3.1参考手册中文版

    这份笔记可能涵盖了作者在学习和使用Hibernate过程中遇到的问题、解决方案以及实用技巧,对于初学者和有经验的开发者都极具价值。 总的来说,《Hibernate3.1参考手册中文版》与《Hibernate笔记.doc》的结合,不仅...

    Hibernate教程-最全-最好_204页

    10. **缓存机制**:介绍Hibernate的缓存策略,包括第一级缓存和第二级缓存,以及第三方缓存解决方案如 Ehcache 的集成。 11. **性能优化**:讲解如何通过批处理、延迟加载、缓存等手段优化Hibernate应用的性能。 ...

Global site tag (gtag.js) - Google Analytics