HQL的使用-part2 hql的查询(4)

来源:互联网 发布:c语言实验正弦信号 编辑:程序博客网 时间:2024/06/05 08:26

4.6.1 HQL 查询(4)

7. orderby 子句

查询返回的列表(list),可以根据类或引用属性的任何属性来进行排序,例如:from Person as porder by p.name, p.age还可使用ase 或 dese关键宇指定升序或降序的排序规则,例如:

from Person as porder by p.name asc, p.age desc

如果没有指定排序规则时,默认采用升序规则。与是否使用asc 关键字没有区别,加 asc 是升序排序,不加asc 也是升序排序。

8. group by子句

利用返回聚集值的查询,可以对持久化类或引用属性的属性进行分组,分组时可使用 groupby 子句。看下面的HQL查询语句:

select cat.color, sum(cat.weight) , count(cat)
from Cat catgroup by cat.color

类似于 SQL 的规则,出现在 select 后的属性要么出现在聚集函数中,要么出现在group by 的属性列表中。看下面示例:

//select 后出现的 id 处出现在 group by 之后,而 name 属性则出现在聚集函数中
select foo.id,avg(且arne) , max(name)
from Foo foo join foo.names namegroup by foo. id

having子句用于对分组进行过滤,例如:

select cat.color, sum(cat.weight) , count(cat)from Cat catgroup 
by cat.colorhaving cat.color in (eg.Color.TABBY, eg.Color.BLACK)

注意: having子句用于对分组进行过滤,因此having子句只能在有groupby 子句时才可以使用,没有groupby 子句,则不能使用having子句。

Hibernate可将 HQL语句直接翻译成数据库SQL语句。因此,如果底层的数据库支持在having和 groupby子句中出现的一般函数或聚集函数,则HQL的 having与 orderby子句中也可以出现一般函数和聚集函数。例如:

select catfrom Cat catjoin cat.kittens kittengroup by 
cathaving avg(kitten.weight)
> 100order by count(kitten) asc, sum(kitten.weight) desc

注意:group by 子句与 orderby 子句中都不能包含算术表达式。

9. 子查询

如果底层数据库支持子查询,则可以在HQL 语句中使用子查询。与 SQL 中子查询相似的是, HQL 中的子查询也需要使用 "0" 括起来。例如:

from Cat as fatcatwhere fatcat.weight > 
( select avg(cat.weight) from DomesticCat cat)
如果 select 中包含多个属性,则应该使用元组构造符:
from Cat as catwhere not ( cat.name, cat.color )in(
select cat.name, cat.color from DomesticCat cat

10. fetch 关键字

对于集合属性, Hibernate 默认采用延迟加载策略。例如,对于持久化类Person,有无法访问关联的 scores 属性。

为了解决该问题,可以在Hibetτlate 映射文件中取消延迟加载,或者使用 fetchjoin。例如:

from Person as p join p.scores

上面的fetch语句将会初始化person 的 scores集合属性。

如果使用了属性级别的延迟加载,可以用fetchall properties 来强制 Hibernate 立即抓取那些原本需要延迟加载的属性。例如:

from Document fetch all properties order by namefrom Document
doc fetch allpropertieswhere lower(doc.name)like'%cats%

11.命名查询

HQL 查询还支持将查询所用的HQL语句放入配置文件中,而不是代码中。通过这种方式,可以大大提高程序的解祸。

下面是使用que可元素定义命名查询的配置文件代码:

<!定义命名查询-->
<query name="myNamedQuery">
<!--此处确定命名查询的HQL语句一〉
from Person as p where p.age > ?
</query>
该命名的HQL查询可以直接通过Session访问,调用命名查询的示例代码如下:
private void findByNamedQuery() throws Exception
//获得 Hibernate Session对象
Session sess = HibernateUtil.currentSession();
//开始事务
Transaction tx = sess.beginTransaction();
System.out.println("执行命名查询");
//调用命名查询
List pl =sess.getNamedQuery( 叮nyNamedQuery")
//为参数赋值
.setinteger(O, 20)
//返回全部结果
.list();
1I:ll!i历结果集for(iteratorpit = pl.iterator() ; pit.hasNext(); )
Person p = ( Person )pit.next();
System.out.println(p.getName() ;
/I提交事务
tx.commit();
HibernateUtil.closeSession();

原创粉丝点击