ITEEDU

Hibernate Gossip: where、group by、order by 子句

可以使用where子句来限定查询的条件,除了 = 运算之外,还有 >、>=、<、<=、!= 或 <>等比较运算,例如:
Session session = sessionFactory.openSession();
Query query = session.createQuery("from User user where user.name='caterpillar'");

List names = query.list();
Iterator iterator =  names.iterator();
while(iterator.hasNext()) {
    User user = (User) iterator.next();
    System.out.println(user.getAge() + "\t" + user.getName());
}
也可以在where子句上进行表达式,例如:
Query query = session.createQuery("from User user where (user.age / 10 = 3)");
也可以在where子句上使用and、or,例如:
Query query = session.createQuery("from User user where (user.age > 20) and (user.name = 'caterpillar')");
is not nullL与is null则可以测试字段值是否为空值,例如:
Query query = session.createQuery("from User user where user.name is not null");

between可以测试字段值是否在指定的范围之内,例如:
Query query = session.createQuery("from User user where user.age between 20 and 30");

可以使用in或not in来测试字段值是否在您指定的集合中,例如:
Query query = session.createQuery("from User user where user.name in('caterpillar', 'momor')");

like或not like可以让您进行模糊条件搜寻,例如想搜寻名称中含有cater开头的数据:
Query query = session.createQuery("from User user where user.name like 'cater%'");

可以对查询结果使用order by进行排序:
Query query = session.createQuery("from User user order by user.age");

可使用desc反排序:
Query query = session.createQuery("from User user order by user.age desc");

可同时指定两个以上的排序方式,例如先按照"age"反序排列,如果"age"相同,则按照"name"顺序排列:
Query query = session.createQuery("from User user order by user.age desc, user.name");
可以配合GROUP BY子句,自动将指定的字段依相同的内容群组,例如依字段"sex"分组并作平均:
Query query = session.createQuery("select user.sex, avg(user.age) from User user group by user.sex");

一个执行的结果如下:
+-------------------------------+
|    sex          |    avg(age)    |
+-------------------------------+
|    male        |    30               |
+-------------------------------+
|    female    |    25                |
+-------------------------------+

还可以结合having子句,例如只将平均大于20的数据分组显示出来:
Query
query = session.createQuery("select user.sex, avg(user.age) from User
user group by user.sex having avg(user.age) > 20");