Hibernate读书笔记-----HQL查询(三)

2014-11-24 08:39:23 · 作者: · 浏览: 2
te values)的查询可以按照一个返回的类或组件(components)中的任何属性(property)进行分组:
[sql]
Select p.id,p.name from Person p group by p.age
可以使用having子句对分组进行过滤
[html]
Select p.id,p.name from Person p group by p.age having p.age between 10 and 40
注意:group by子句与 order by子句中都不能包含算术表达式。也要注意Hibernate目前不会扩展group的实体,因此你不能写group by cat,除非cat的所有属性都不是聚集的。你必须明确的列出所有的非聚集属性。

十、子查询
对于支持子查询的数据库,Hibernate支持在查询中使用子查询。一个子查询必须被圆括号包围起来(经常是SQL聚集函数的圆括号)。 甚至相互关联的子查询(引用到外部查询中的别名的子查询)也是允许的。
[html]
From Person p where p.age > (select avg(p1.age) from Person p1 )
与SQL子查询相同,如果子查询是多行结果集,则应该使用多行运算符。同时HQL子查询只可以在select子句或者where子句中出现。
如果在select子查询或的列表中包含多项,则在HQL中需要使用一个元组构造符:
[sql]
From Person as p where (p.name,p.age) in (select s.name,s,age from Student as s)

十一、命名查询
HQL查询还支持将查询所用的HQL语句放在配置文件中,而不是程序代码中。通过这种方式,可以大大提高程序的解耦。
在Hibernate映射文件中使用元素来定义命名查询。使用元素是需要指定一个name属性,该属性指定该命名查询的名字。
[html]


from Person as p

Session提供一个getNamedQuery(String name)方法用于获取指定命名HQL查询并且创建Query对象。
[html]
public void namedQuery(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//执行命名查询
List list = session.getNamedQuery("namedQuery").list();
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person p = (Person) iterator.next();
System.out.println(p.getName());
}
tx.commit();
session.close();
}


作者:chenssy