`
jiakechong
  • 浏览: 207391 次
社区版块
存档分类
最新评论

Criteria查询 --- 结果集Distinct解决方案1 / 2

阅读更多
from:
http://heipark.iteye.com/blog/378540

相信大家都很喜欢Criteria查询,因为它对查询条件已经查询实体采用松散的组合,不像HQL那样需要拼字符串。
但是又会比较抵触它,因为对它的不熟悉,写复杂查询可能会不顺手,一个子查询也可能会很麻烦。

今天我用半天时间与大家分享Criteria查询里面弯路比较多的结果集distinct,这个在HQL里面很简单,但在Criteria查询还真是头疼,网上的文章也是很模糊而且讨论的比较片面,我希望通过这篇文章让大家少走弯路,多用Criteria查询,少用HQL拼字符串。呵呵。

Criteria的结果集最常用分两种:对象List、List<Object[]>(投影查询),这两种查询结果的distinct处理的方式也是不一样的。稍后会分别讨论。

本文用到模型类:

Device.java
====================================
Java代码

   1. @Entity 
   2. @Table(name = "DEVICE") 
   3. public class Device extends Maintainable { 
   4.  
   5.     private Long id; 
   6.  
   7.     private String name; 
   8.  
   9.     private NodeCabinet nodeCabinet;// 所属机柜 
  10.  
  11.     // setter getter method ...  
  12. } 

@Entity
@Table(name = "DEVICE")
public class Device extends Maintainable {

private Long id;

private String name;

private NodeCabinet nodeCabinet;// 所属机柜

// setter getter method ...
}


1. 基本知识:

1.1 Criteria不支持distinct对象结果集吗?
re: Criteria通过setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)方法对查询后结果进行排重,请注意,这种方式是先查询出可能重复的记录然后根据每个对象的equals方法进行排重,如果不需要分页,而且你的查询结果集很小的话,可以使用这种方式distinct结果集。
warning:

    * 1. 要排重的对象要实现equals方法。
    * 2. 不能进行分页处理,因为是先查询后distinct,结果会不准确。
    * 3. 查询处理的结果集太大的话,可能存在性能问题,相同记录会查询多次。



示例代码 1-1:
Java代码

   1. Criteria c = manager.createCriteria(Device.class); 
   2. ..... 
   3. criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
   4. List result = c.list(); 

Criteria c = manager.createCriteria(Device.class);
.....
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
List result = c.list();



1.2 Criteria如何进行投影查询我需要的几个字段?
re:Criteria通过设置projectionList就可以只查询指定字段。
warning:Criteria投影查询出来的结果集格式是这样的:List<Object[]> 前台遍历集合的时候需要使用数组下标访问数据。

示例代码 1-2:
Java代码

   1. Criteria c = manager.createCriteria(Device.class); 
   2. ..... 
   3. ProjectionList projectionList = Projections.projectionList(); 
   4. projectionList.add(Projections.property("id")); 
   5. projectionList.add(Projections.property("name")); 
   6. c.setProjection(projectionList); //生成如下SQL: select id, name from .... 
   7. List result = c.list(); 

Criteria c = manager.createCriteria(Device.class);
.....
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("id"));
projectionList.add(Projections.property("name"));
c.setProjection(projectionList); //生成如下SQL: select id, name from ....
List result = c.list();




2. Criteria投影distinct查询

2.1 Criteria投影distinct查询
Criteria对投影的支持比返回对象的方式支持的好很多。以下是样例代码,与比示例1-2代码只有一行差别:

示例代码 2-1:
Java代码

   1. Criteria c = manager.createCriteria(Device.class); 
   2. ..... 
   3. ProjectionList projectionList = Projections.projectionList(); 
   4. projectionList.add(Projections.property("id")); 
   5. projectionList.add(Projections.property("name")); 
   6. c.setProjection(Projections.distinct(projectionList));  // >>>> 这里差别 生成如下SQL: select distinct id, name from .... 
   7. List result = c.list(); 

Criteria c = manager.createCriteria(Device.class);
.....
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("id"));
projectionList.add(Projections.property("name"));
c.setProjection(Projections.distinct(projectionList)); // >>>> 这里差别 生成如下SQL: select distinct id, name from ....
List result = c.list();



2.2 分页情况下Criteria查询如何计算total records count
投影情况下如何计算distinct后分页total records count?
re:Criteria通过Projection计算count。先算count然后在投影。计算count的可以封装到单独查询方法里。

示例代码:
Java代码

   1. Criteria c = manager.createCriteria(Device.class); 
   2. ..... 
   3. criteria.setProjection(Projections.countDistinct("id")); // select count(distcint id) from ... 
   4. Integer totalCount = (Integer) criteria.uniqueResult();  
   5.  
   6. ProjectionList projectionList = Projections.projectionList(); 
   7. projectionList.add(Projections.property("id")); 
   8. projectionList.add(Projections.property("name")); 
   9. c.setProjection(Projections.distinct(projectionList));  // 生成如下SQL: select distinct id, name from .... 
  10. List result = c.list(); 
分享到:
评论

相关推荐

    Hibernate-Criteria 模糊查询

    2. **排序**:`Criteria`允许你指定查询结果的排序规则,使用`addOrder`方法添加`Order`实例。 ```java criteria.addOrder(Order.asc("name")); criteria.addOrder(Order.desc("groupId")); ``` 3. **分页**:...

    Python库 | criteria-etl-1.0a3.tar.gz

    1. **数据提取(Extract)**:`criteria-etl`可能包含了多种数据源接口,如SQL数据库、CSV文件、JSON文件或是API接口等,允许用户轻松地从各种来源获取数据。 2. **数据转换(Transform)**:库中的转换模块可能是...

    Hibernate-Criteria_模糊查询

    5. **执行查询并处理结果**:调用Criteria的list()方法执行查询,返回List集合,遍历集合处理查询结果。 6. **关闭Session和Transaction**:最后,别忘了关闭Session和提交事务。 #### 示例代码 ```java public ...

    Criteria连表查询

    Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询

    WLCSP VMI Pass Fail requirement (criteria)-Flip Chip VI Criteria

    ### WLCSP VMI Pass/Fail Requirement (Criteria) - Flip Chip VI Criteria #### 概述 在微电子封装领域,WLCSP(Wafer Level Chip Scale Package)与Flip Chip技术被广泛应用于各种高性能集成电路(IC)封装。这些...

    Criteria标准化对象查询小例子

    6. **处理结果**: 查询结果通常是一个实体列表,可以根据需要进行进一步处理。 在实际应用中,Criteria API还可以与其他JPA特性结合,如 Specifications,它提供了一种更简洁的方式来构建复杂的查询条件。...

    hibernateCriteria查询

    若要对查询结果进行排序,可以使用`Criteria` 的`addOrder()` 方法。例如,按价格降序排列: ```java Criteria criteria = session.createCriteria(Books.class); criteria.addOrder(Order.desc("price")); List...

    09 Criteria查询方式

    5. **执行查询**:最后,调用Criteria的list()或uniqueResult()方法执行查询,得到查询结果。 举个例子,如果我们有一个User实体类,想查询所有名字为"John"的用户,可以这样写: ```java Session session = ...

    ExtremeLearningMachine资源共享-New-delay-dependent-stability-criteria-for-uncertain-stochastic_2013_Neuroco.pdf

    ExtremeLearningMachine资源共享-New-delay-dependent-stability-criteria-for-uncertain-stochastic_2013_Neuroco.pdf 小弟准备学习ELM,才收集到一些相关资料,发现论坛中并无相关资料,因此把自己手头上收集到...

    node-json-criteria:JSON对象Mongo风格的条件查询

    安装npm install json-criteria --save用法节点// npm install babel --save// Once at the entrypoint of your app.require('babel/register')var test = require('json-criteria').testconsole.log(test( {foo:1},...

    Hibernat 使用Criteria查询多对多关系(SET集合)条件

    1. **集合填充问题:** 当查询结果返回后,每个`MainClass`实例的`subs`集合都应被正确填充,包括与之关联的所有`SubClass`实体。如果发现某些实体没有被加载,可能是由于Hibernate的懒加载机制或查询设置问题导致的...

    Hibernate中,利用Criteria查询容器实现sql的写法

    4. **Projections**: 用于定义查询结果的返回类型和形式,比如返回单个字段值、聚合函数结果或整个实体对象。 5. **Order**: 用于设置排序条件,可以指定升序或降序排列。 以下是一个简单的示例,展示如何使用...

    criteria介绍与使用

    - 通过`Projections`工具类可以指定查询结果的聚合方式,如`Projections.avg("age")`计算平均年龄。 5. **使用FetchMode** - 可以通过设置`Criteria`对象的`setFetchMode(String propertyName, FetchMode ...

    -J-STD-001HA &amp;-A-610HA_EN automotive addendum

    It provides criteria to ensure the reliability of soldered automotive electrical and electronic assemblies in the field under harsh environments and considers automated high-volume production. ...

    Criteria查询

    Criteria查询教程ppt课件内容详解

    Regularity criteria for the Navier-Stokes-Landau-Lifshitz

    Navier-Stokes-Landau-Lifshitz方程组的正则性准则,樊继山,高洪俊,在本文中, 我们研究了Navier-Stokes-Landau-Lifshitz 方程组正则性准则。利用精细的估计,得到了Navier-Stokes-Landau-Lifshitz 方程组的光滑解...

    Criteria.pdf

    - **Projection**:用于指定查询返回的结果集的结构,它可以是聚合函数(如`avg`、`count`、`max`、`min`、`sum`)或者特定的实体属性。`Projection`的使用使得`Criteria`不仅能够执行标准的查询,还能够执行报表...

    前端开源库-waterline-criteria

    此外,社区论坛和Stack Overflow等平台上有许多关于waterline-criteria的讨论和解决方案,有助于开发者解决遇到的问题。 总的来说,waterline-criteria是前端开发中处理数据库查询的一个强大工具,特别是对于使用键...

    Criteria hibernate

    查询结果通常是一个List,但我们可以使用Transformers类的实例化方法,如asList(), asScalar()等,来转换结果集。 10. **源码分析** 对于深入理解Criteria API的工作原理,查看和分析其源码是非常有价值的。通过...

Global site tag (gtag.js) - Google Analytics