Criteria查询 --- 结果集Distinct解决方案1 / 2
相信大家都很喜欢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 ... }Criteria c = manager.createCriteria(Device.class);.....criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)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();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();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();