1. Criteria criteria=session.createCriteria(User.class);
2. ProjectionList proList = Projections.projectionList();//设置投影集合
3. proList.add(Projections.groupProperty( "userName "));
4. proList.add(Projections.groupProperty( "password "));
5. criteria.setProjection(proList);
6.
/
//.add(Projections.property("buyerSex"))//设置查询哪一列
7. 最后返回的List是 Object[] , [0] = userName, [1] = password
去重 cr.setProjection(Projections.distinct(Projections.property("thirdClass")));
如果想结合统计与分组功能,则可以使用ProjectionList,例如下面的程式会计算每个年龄各有多少个人:
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("age"));
projectionList.add(Projections.rowCount());
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(projectionList);
List users = criteria.list();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
Object[] o = (Object[]) iterator.next();
System.out.println(o[0] + "\t" +o[1]);
3. 结果集排序
可以使用org.hibernate.criterion.Order来为查询结果排序。
List cats = sess.createCriteria(Cat.class)
.add(Restrictions.like("name", "F%")
.addOrder(Order.asc("name") )
.addOrder(Order.desc("age") )
.setMaxResults(50)
.list();
List cats =sess.createCriteria(Cat.class)
.add(Property.forName("name").like("F%") )
.addOrder(Property.forName("name").asc() )
.addOrder(Property.forName("age").desc() )
.setMaxResults(50)
.list();
7. 投影、聚合和分组
org.hibernate.criterion.Projections是 Projection的实例工厂。通过调用
setProjection()应用投影到一个查询。
List results =session.createCriteria(Cat.class)
.setProjection(Projections.rowCount() )
.add(Restrictions.eq("color", Color.BLACK) )
.list();
List results =session.createCriteria(Cat.class)
.setProjection(Projections.projectionList()
.add( Projections.rowCount())
.add(Projections.avg("weight") )
.add(Projections.max("weight") )
.add(Projections.groupProperty("color") )
)
.list();
List cats = sess.createCriteria(Cat.class)
.add(Restrictions.like("name", "F%")
.createCriteria("kittens")
.add(Restrictions.like("name", "F%")
.list();
alias 起别名
avg 一个属性的平均值
count 一个属性的count值
countDistincat 一个不重复的属性的count值
distinct 一个属性的唯一值
groupProperty 一个分组的属性
id 标识列的值
max 一个属性的最大值
min 一个属性的最小值
projectionList 创建一个映射集合
property 一个项目的映射值
rowcount 一个查询的行数
sqlGroupProjection
sum 一个属性的sum值
Projections.distinct(Projections.property("thirdClass"))去重
① avg(String propertyName):计算属性字段的平均值。
② count(String propertyName):统计一个属性在结果中出现的次数。
③ countDistinct(String propertyName):统计属性包含的不重复值的数量。
④ max(String propertyName):计算属性值的最大值。
⑤ min(String propertyName):计算属性值的最小值。
⑥ sum(String propertyName):计算属性值的总和。
(1)使用Projections的alias()方法为指定投影指定别名。一旦为projection指定了别名,则程序就可以根据该Projection别名来进行其他额外操作了,比如排序。条件查询片段如下:
List l =session.createCriteria(Enrolment.class)
.setProjection(Projections.projectionList()
//按course进行分组
.add(Projections.groupProperty("course"))
//统计记录条数,并为统计结果指定别名c
.add(Projections.alias(Projections.rowCount()," c"))
).addOrder(Order,asc("c"))
.list();
(2)使用SimpleProjection的as()方法为自身指定别名。
List l =session.createCriteria(Enrolment.class)
.setProjection(Projections.projectionList()
//按course进行分组
.add(Projections.groupProperty("course").as("c"))
//统计记录条数,并为统计结果指定别名c
.add(Projections.rowCount())
).addOrder(Order,asc("c"))
.list();
(3)使用ProjectionList的add()方法添加投影时指定别名。
ProjectionList的add()方法有两个重载形式,一个是直接添加投影,另一个是在添加投影时指定别名。条件查询片段如下:
List l =session.createCriteria(Enrolment.class)
.setProjection(Projections.projectionList()
//按course进行分组,指定别名为c
.add(Projections.groupProperty("course"),("c"))
//统计记录条数,并为统计结果指定别名rc
.add(Projections.rowCount(),"rc")
).addOrder(Order,asc("c"))
.list();