Criteria进阶查询,包括分组,统计和排序等
您可以使⽤Criteria进⾏查询,并使⽤Order对结果进⾏排序,例如使⽤Oder.asc()由⼩到⼤排序(反之则使⽤desc()):
Criteria criteria = ateCriteria(User.class);
criteria.addOrder(Order.asc("age"));
List users = criteria.list()
;
setMaxResults()⽅法可以限定查询回来的笔数,如果配合setFirstResult()设定传回查询结果第⼀笔资料的位置,就可以实现简单的分页,例如传回第51笔之后的50笔资料(如果有的话):
Criteria criteria = ateCriteria(User.class);
criteria.setFirstResult(51);
distinct查询criteria.setMaxResult(50);
List users = criteria.list();
您可以对查询结果进⾏统计动作,使⽤Projections的avg()、rowCount()、count()、max()、min()、 countDistinct()等⽅法,例如对查询结果的"age"作平均:
Criteria criteria = ateCriteria(User.class);
criteria.setProjection(Projections.avg("age"));
List users = criteria.list();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
System.out.());
}
还可以配合Projections的groupProperty()来对结果进⾏分组,例如以"age"进⾏分组,也就是如果资料中"age"如果有 20、20、25、30,则以下会显⽰20、25、30:
Criteria criteria = ateCriteria(User.class);
criteria.upProperty("age"));
List users = criteria.list();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
System.out.());
}
如果想结合统计与分组功能,则可以使⽤ProjectionList,例如下⾯的程式会计算每个年龄各有多少个⼈: ProjectionList projectionList = Projections.projectionList();
projectionList.upProperty("age"));
projectionList.wCount());
Criteria criteria = ateCriteria(User.class);
criteria.setProjection(projectionList);
List users = criteria.list();
Iterator iterator = users.iterator();
while(iterator.hasNext()) {
Object[] o = (Object[]) ();
System.out.println(o[0] + "\t" + o[1]);
}
如果有⼀个已知的物件,则可以根据这个物件作为查询的依据,看看是否有属性与之类似的物件,例如:
User user = new User();
user.setAge(new Integer(30));
Criteria criteria = ateCriteria(User.class);
criteria.ate(user));
List users = criteria.list();
Iterator iterator = users.iterator();
System.out.println("id \t name/age");
while(iterator.hasNext()) {
User ur = (User) ();
System.out.Id() +
" \t " + ur.getName() +
"/" + ur.getAge());
}
在这个例⼦中,user物件中有已知的属性"age"为30,使⽤Example会⾃动过滤掉user的空属性,并以之作为查询的依据,也就是出"age"同为30的资料。
Criteria可以进⾏复合查询,即在原有的查询基础上再进⾏查询,例如在Room对User的⼀对多关联中,在查询出所有的Room资料之后,希望再查询users中"age"为30的user资料:
Criteria roomCriteria = ateCriteria(Room.class);
Criteria userCriteria = ateCriteria("users");
userCriteria.add(Restrictions.eq("age", new Integer(30)));
List rooms = roomCriteria.list(); // 只列出users属性中有user之"age"为30的Room
Iterator iterator = rooms.iterator();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论