注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

断尘居

温柔的男人像海洋。

 
 
 
 
 

日志

 
 

简述Hibernate部分查询语句  

2011-01-24 10:47:21|  分类: SSH |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Hibernate配备了一种非常强大的Hibernate查询语句,这种语言看上去很像SQL。本文主要介绍select子句、聚集函数、多态查询。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。

1. select子句

select 子句选择将哪些对象与属性返 回到查询结果集中. 考虑如下情况:

  1. select mate   
  2. from Cat as cat   
  3.     inner join cat.mate as mate 

该语句将选择mates of other Cats。(其他猫的配偶) 实际上, 你可以更简洁的用以下的查询语句表达相同的含义:

  1. select cat.mate from Cat cat 

Hibernate查询语句可以返回值为任何类型的属性,包括返回类型为某种组件(Component)的属性:

  1. select cat.name from DomesticCat cat  
  2. where cat.name like 'fri%'  
  3. select cust.name.firstName from Customer as cust  

Hibernate查询语句可以返回多个对象和(或)属性,存放在 Object[]队列中,

  1. select mother, offspr, mate.name   
  2. from DomesticCat as mother  
  3.     inner join mother.mate as mate  
  4.     left outer join mother.kittens as offspr 

或存放在一个List对象中,

  1. select new list(mother, offspr, mate.name)  
  2. from DomesticCat as mother  
  3.     inner join mother.mate as mate  
  4.     left outer join mother.kittens as offspr 

也可能直接返回一个实际的类型安全的Java对象,

  1. select new Family(mother, mate, offspr)  
  2. from DomesticCat as mother  
  3.     join mother.mate as mate  
  4.     left join mother.kittens as offspr 

假设类Family有一个合适的构造函数.

你可以使用关键字as给“被选择了的表达式”指派别名:

  1. select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n  
  2. from Cat cat 

这种做法在与子句select new map一起使用时最有用:

  1. select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )  
  2. from Cat cat 

该Hibernate查询语句返回了一个Map的对象,内容是别名与被选择的值组成的名-值映射。

3. 聚集函数

HQL查询甚至可以返回作用于属性之上的聚集函数的计算结果:

  1. select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)  
  2. from Cat cat 

受支持的聚集函数如下:

  1. avg(...), sum(...), min(...), max(...)   
  2.  
  3. count(*)   
  4.  
  5. count(...), count(distinct ...), count(all...)   

你可以在选择子句中使用数学操作符、连接以及经过验证的SQL函数:

  1. select cat.weight + sum(kitten.weight)   
  2. from Cat cat   
  3.     join cat.kittens kitten  
  4. group by cat.id, cat.weight  
  5. select firstName||' '||initial||' '||upper(lastName) from Person  

关键字distinct与all 也可以使用,它们具有与SQL相同的语义.

  1. select distinct cat.name from Cat cat  
  2.  
  3. select count(distinct cat.name), count(cat) from Cat cat 

3. 多态查询

一个如下的Hibernate查询语句:

  1. from Cat as cat 

不仅返回Cat类的实例, 也同时返回子类 DomesticCat的实例. Hibernate 可以在from子句中指定任何 Java 类或接口. 查询会返回继承了该类的所有持久化子类 的实例或返回声明了该接口的所有持久化类的实例。下面的查询语句返回所有的被持久化的对象:

  1. from java.lang.Object o 

接口Named 可能被各种各样的持久化类声明:

  1. from Named n, Named m where n.name = m.name 

注意:最后的两个查询将需要超过一个的SQL SELECT.这表明order by子句 没有对整个结果集进行正确的排序. (这也说明你不能对这样的查询使用Query.scroll()方法.)

  评论这张
 
阅读(1257)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017