相信大家都很喜欢Criteria查询,因为它对查询条件已经查询实体采用松散的组合,不像HQL那样需要拼字符串。
但是又会比较抵触它,因为对它的不熟悉,写复杂查询可能会不顺手,一个子查询也可能会很麻烦。
今天我用半天时间与大家分享Criteria查询里面弯路比较多的结果集distinct,这个在HQL里面很简单,但在Criteria查询还真是头疼,网上的文章也是很模糊而且讨论的比较片面,我希望通过这篇文章让大家少走弯路,多用Criteria查询,少用HQL拼字符串。呵呵。
Criteria的结果集最常用分两种:对象List、List<Object[]>(投影查询),这两种查询结果的distinct处理的方式也是不一样的。稍后会分别讨论。
本文用到模型类:
Device.java
====================================
@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:
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:
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:
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的可以封装到单独查询方法里。
示例代码:
Criteria c = manager.createCriteria(Device.class);
.....
criteria.setProjection(Projections.countDistinct("id")); // select count(distcint id) from ...
Integer totalCount = (Integer) criteria.uniqueResult();
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();
分享到:
相关推荐
Hibernate中的Criteria连表查询,包括单表属性查询,多表内连,以及左外连接查询
python库。 资源全名:criteria-etl-1.0a3.tar.gz
Hibernate-Criteria 模糊查询
Hibernate-Criteria_模糊查询
hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria hibernate-Criteria
WLCSP & Flip Chip Visual Inspection Criteria
ExtremeLearningMachine资源共享-New-delay-dependent-stability-criteria-for-uncertain-stochastic_2013_Neuroco.pdf 小弟准备学习ELM,才收集到一些相关资料,发现论坛中并无相关资料,因此把自己手头上收集到...
安装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},...
Criteria查询教程ppt课件内容详解
Navier-Stokes-Landau-Lifshitz方程组的正则性准则,樊继山,高洪俊,在本文中, 我们研究了Navier-Stokes-Landau-Lifshitz 方程组正则性准则。利用精细的估计,得到了Navier-Stokes-Landau-Lifshitz 方程组的光滑解...
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查询将数据查询条件封装成为一个对象,可以堪称是传统SQL的对象化表示。
09 Criteria查询方式
CRITERIA-1D / GEO CRITERIA-1D是一种农业水文学模型,用于模拟一维水通量,作物生长和作物需水量。可以在不同的详细级别定义土壤和作物参数。它需要每日农业气象数据作为输入:最低和最高气温,总降水量以及皮下...
1、掌握Hibernate框架应用项目 2、学习HQL参数查询和Criteria查询 3、比较HQL和Criteria的不同 建立web项目,通过页面查询构造动态查询语句,struts2和hibernate框架整合。
EasyCriteria 是一个轻量级的框架用来创建和处理基于元数据、类型安全、可调式、可读和可维护的 JPA 2.0 查询。示例代码: CriteriaComposer(Student.class).select(AggregateFunction.SUM,Student_.unit).groupBy...
Multi-Criteria Chinese Word Segmentationwith Transformer 译文 谷歌翻译版,仅供参考
ATIS-0600307.2007 Fire Resistance Criteria - Ignitability Requirements For Equipment Assemblies , Ancillary Non-Metallic Apparatus , And Fire Spread Requirements For Wire And Cable - 完整英文版(15页...
1 可以根据前台传过来的查询数据自动构建查询条件 2 可以生成纯SQl 3 也可以直接使用preparestatement进行查询,返回我们想要的数据。 初步版本已经实现,数据库兼容性暂时没时间考虑。目前我们使用的是ORACLE...