发信人: lightning (秦兽部落十大神器--秦之昆仑镜), 信区: Java
标  题: hql的使用
发信站: 武汉白云黄鹤站 (2008年10月30日18:52:05 星期四), 站内信件


抄自《深入浅出hibernate》

hql语法结构(hibernate3):
[select/update/delete ...] [from ...] [where ...] [group by ...]
[having ...] [order by ...]



1,实体查询
String hql="from TUser";
Query query=session.createQuery(hql);
List userList=query.list();
如果有相同类名的话,要用完全类名,比如"from
com.redsaga.hibernate.db.entity.TUser"

有where的:
from TUser user where user.age>20
from TUser user where user.age in (18,28)
from TUser user where user.name like 'Er%'
from TUser user where (user.age>20) and (user.name like 'Er%')

2,属性查询
实际上有没有别名都无关紧要
List list=session.createQuery("select user.name from TUser user").list();
每个element都是String

如果是
select user.name,user.age from ...
那么list的每个element是Object[]

你说这个是不是很丑陋,所以有这种hsql
select new TUser(user.name,user.age) ....

前提是TUser类中有这种构造器
出来的对象是自由态的,就是没有跟session发生关联,没有被hibernate管理。
所以出来的对象如果你又save,会产生insert的效果。
出来的对象其他的属性会是null

属性查询最方便的是用于统计
select count(*),min(user.age) from ...
取出Object[]来处理

甚至可以用原生sql函数例如:
select upper(user.name) from ...
加distinct关键字
select distinct user.name from ...

3,实体更新和删除
hibernate2中只能取得持久态对象而后用setter改变最后save

但是hibernate3中的hql支持update和delete了
比如:
String hql="update TUser set age=18 where id=1";
Query query=session.createQuery(hql);
query.executeUpdate();

删除:
delete from...where age>18

4,分组和排序
hql支持order by ,group by,having
所以:
from TUser order by name desc
会得到名字降序的实体对象
当然也可以多个排序对象
from TUser ordery by name,age

group by: 

select count(user),user.age from TUser group by user.age 

having: 

select count(user),user.age from TUser group by user.age having count(user)>10



5,参数绑定:

Session.find: 

session.find("from TUser user where user.name=?","Erica",Hibernate.STRING); 

多参数Session.find: 

Object[] args=new Object[]{"Erica",new Integer(20)}; 

Type[] types=new Type[]{Hibernate.STRING,Hibernate.INTEGER}; 

session.find("from TUser user where user.name=? and user.age>?",args,types);



通过Query接口:

Query query=session.createQuery("from TUser user where user.name=? and 

user.age>?"); 

query.setString(0,"Erica"); 

query.setInteger(1,20); 

还可以用引用占位符: 

String hql="from TUser where name=:name"; 

Query query=session.createQuery(hql); 

query.setParameter("name","Erica");



甚至还可以用JavaBean封装参数

class UserQuery{ 

private String name; 

pivate Integer age; 

//getter_setter 

} 

String hql="from TUser where name=:name and age=:age"; 

Query query=session.createQuery(hql); 

UserQuery uq=new UserQuery(); 

uq.setName("Erica"); 

uq.setAge(new Integer(20)); 

query.setProperties(uq);