Hibernate HQL语言

HQL查询
节 10.01    单表HQL查询

Sql代码 复制代码
  1. FROM CUSTOMERS as customers  
FROM CUSTOMERS as customers

 


节 10.02    Where子句
(a)    比较表达式

Sql代码 复制代码
  1. FROM CUSTOMERS as customers WHERE customers.id=1   
  2. FROM CUSTOMERS as customers WHERE customers.amount between 1 and 10   
  3. FROM CUSTOMERS as customers WHERE customers.amount >100   
  4. FROM CUSTOMERS as customers WHERE customers.email in ('foo@bar','bar@foo')   
  5. FROM CUSTOMERS as customers WHERE customers.email IS NULL  
  6. FROM CUSTOMERS as customers WHERE customers.email IS NOT NULL  
  7. FROM CUSTOMERS as customers WHERE customers.email LIKE '@%'  
FROM CUSTOMERS as customers WHERE customers.id=1
FROM CUSTOMERS as customers WHERE customers.amount between 1 and 10
FROM CUSTOMERS as customers WHERE customers.amount >100
FROM CUSTOMERS as customers WHERE customers.email in ('foo@bar','bar@foo')
FROM CUSTOMERS as customers WHERE customers.email IS NULL
FROM CUSTOMERS as customers WHERE customers.email IS NOT NULL
FROM CUSTOMERS as customers WHERE customers.email LIKE '@%'

 

 

HQL 操作符

HQL 常用操作符

描述

.

导航路径表达式操作符

+,-

一元正负号

*,/

乘除法

+,-

加减法

=,<>,<,>,>=,<=,[NOT]BETWEEN[NOT] LIKE,[NOT] IN,IS [NOT] NULL,IS [NOT] EMPTY

二元比较操作符

NOT,AND,OR

逻辑操作符


HQL操作符



(b)    HQL常用函数

Sql代码 复制代码
  1. FROM User u where lower(u.email) = 'foo@163.com' --小写   
  2. FROM User u where lower(u.email) = 'foo@163.com' --大写   
  3. FROM User u where concat(u.firstname,u.lastname) like 'G% K%' --拼接字符串   
  4. FROM User u where size(u.bids) > 3 --集合大小  
FROM User u where lower(u.email) = 'foo@163.com' --小写
FROM User u where lower(u.email) = 'foo@163.com' --大写
FROM User u where concat(u.firstname,u.lastname) like 'G% K%' --拼接字符串
FROM User u where size(u.bids) > 3 --集合大小

 

HQL 函数

HQL 常用操作符

描述

UPPER(s),LOWER(s)

大小写

CONCAT(s1,s2)

连接字符串

SUBSTRING(s,offset,length)

取子串

TRIM()

去空格

LENGTH(s)

长度

LOCATE(search,s,offset)

搜索位置

ABS(n),SQRT(n),MOD(dividend,divisor)

绝对值,开方,除法

SIZE

大小写

BIT_LENGTH(s)

位数

CUTTENT_DATE()

当前时间

CURRENT_TIME()

CURRENT_TIMESTAMP()

SECOND(d)

获取时间的不同部分

MINUTE(d)

HOUR(d)

DAY(d)

MONTH(d)

YEAR(d)

CAST(t as TYPE)

类型转换


HQL函数

节 10.03    Order表达式

 

Sql代码 复制代码
  1. FROM CUSTOMERS as customers WHERE customers.id=1    
  2. ORDER BY customers.id FROM CUSTOMERS as customers    
  3. ORDER BY customers.lastname asc,firstname asc  
FROM CUSTOMERS as customers WHERE customers.id=1 
ORDER BY customers.id FROM CUSTOMERS as customers 
ORDER BY customers.lastname asc,firstname asc

 


节 10.04    投影查询

Sql代码 复制代码
  1. SELECT user.username,user.password FROM UserInfo user  
SELECT user.username,user.password FROM UserInfo user

 


注:1、在使用Select子句查询时,要给表对象起一个别名。
    2、查询出的结果集是一个Object[]数组。
节 10.05    表关联
(a)    隐式关联连接

Sql代码 复制代码
  1. FROM User u WHERE u.homeAddress.city = 'BJ'  
  2. SELECT distinct u.homeAddress.city FROM User u   
  3. FROM Bid bid WHERE bid.item.description like '%FOO%'  
FROM User u WHERE u.homeAddress.city = 'BJ'
SELECT distinct u.homeAddress.city FROM User u
FROM Bid bid WHERE bid.item.description like '%FOO%'

 


(b)    普通联结

Sql代码 复制代码
  1. FROM ITEM i JOIN i.bids b WHERE i.description like '%Foo%' AND b.amount > 100  
FROM ITEM i JOIN i.bids b WHERE i.description like '%Foo%' AND b.amount > 100

 

Java代码 复制代码
  1. Iterator iterator = query.list().iterator();   
  2. while(iterator.hasNext()){   
  3. Object[] pair = (Object[])iterator.next();   
  4. Item item = (Item)pair[0];   
  5. Bid bid = (Bid)pair[1];   
  6. }  
Iterator iterator = query.list().iterator();
while(iterator.hasNext()){
Object[] pair = (Object[])iterator.next();
Item item = (Item)pair[0];
Bid bid = (Bid)pair[1];
}

 

 

Sql代码 复制代码
  1. SELECT i FROM ITEM i JOIN i.bids b WHERE i.description like '%Foo%' AND b.amount >100  
SELECT i FROM ITEM i JOIN i.bids b WHERE i.description like '%Foo%' AND b.amount >100

 

 

Java代码 复制代码
  1. Iterator iterator = query.list().iterator();   
  2. while(iterator.hasNext()){   
  3. Item item = (Item)i.next();}  
Iterator iterator = query.list().iterator();
while(iterator.hasNext()){
Item item = (Item)i.next();}

 

Sql代码 复制代码
  1. FROM ITEM i LEFT JOIN i.bids b WITH b.amount >1000 WHERE i.description   
  2.  like '%Foo%' --WITH额外联结条件  
FROM ITEM i LEFT JOIN i.bids b WITH b.amount >1000 WHERE i.description
 like '%Foo%' --WITH额外联结条件

 


(c)    抓取联结
fetch 连接允许仅使用一个select语句就将关联的对象或一组集合随他们父对象的初始化而初始化。

Sql代码 复制代码
  1. FROM ITEM i LEFT JOIN FETCH i.bids WHERE i.description LIKE '%Foo%'  
FROM ITEM i LEFT JOIN FETCH i.bids WHERE i.description LIKE '%Foo%'

 


注:普通联结同抓取联结的区别:
1、    生成的SQL语句虽然有连接,但是并没有取连接表的数据,还是需要单独的sql取数据。
2、    抓取联结一次性将所需要的数据装入内存中。
3、    当lazy=true时,抓取策略失效。
节 10.06    报表查询
(a)    统计函数投影

Sql代码 复制代码
  1. SELECT COUNT(user.id), MAX(user.id), SUM(user.id),MIN(user.id),AVG(user.score)     
  2. FROM UserInfo user  
SELECT COUNT(user.id), MAX(user.id), SUM(user.id),MIN(user.id),AVG(user.score)  
FROM UserInfo user

 


注:因为属于投影查询所以返回的结果为Object[]数组
(b)    分组

Sql代码 复制代码
  1. SELECT u.lastname,count(u) FROM User u group by u.lastname   
  2. SELECT bid.item.id,avg(bid.amount) FROM Bid bid GROUP BY bid.item.id   
  3. SELECT bid.item.id,count(bid),avg(bid.amount)    
  4. FROM Bid bid WHERE bid.item.successfulBid IS NULL GROUP BY bid.item.id   
  5. SELECT bidItem.id,count(bid),avg(bid.amount)   
  6.  FROM Bid bid JOIN bid.item bidItem WHERE bidItem.successfulBid IS NULL GROUP BY bidItem.id   
  7. SELECT item.id,count(bid),avg(bid.amount)    
  8. FROM Item item JOIN item.bids.bid WHERE item.successfulBid IS NULL    
  9. GROUP BY item.id HAVING count(bid) >10  
SELECT u.lastname,count(u) FROM User u group by u.lastname
SELECT bid.item.id,avg(bid.amount) FROM Bid bid GROUP BY bid.item.id
SELECT bid.item.id,count(bid),avg(bid.amount) 
FROM Bid bid WHERE bid.item.successfulBid IS NULL GROUP BY bid.item.id
SELECT bidItem.id,count(bid),avg(bid.amount)
 FROM Bid bid JOIN bid.item bidItem WHERE bidItem.successfulBid IS NULL GROUP BY bidItem.id
SELECT item.id,count(bid),avg(bid.amount) 
FROM Item item JOIN item.bids.bid WHERE item.successfulBid IS NULL 
GROUP BY item.id HAVING count(bid) >10

 


节 10.07    子查询

Sql代码 复制代码
  1. FROM User u WHERE 10 < (SELECT count(i) from u.items i where i.successfulBid IS NOT NULL)   
  2. FROM Item i WHERE 100 > all(SELECT b.amount FROM i.bids b) --出价小于100   
  3. FROM Item i WHERE 100 > any(SELECT b.amount FROM i.bids b) --出价大于100   
  4. FROM Item i WHERE 100 > some(SELECT b.amount FROM i.bids b)  --出价等于100   
  5. FROM Item i WHERE 100 IN (SELECT b.amount FROM i.bids b)  --出价等
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值