Hibernate3-语法速查

 发信人: 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);

你可能感兴趣的:(Hibernate3-语法速查)