您的位置:首页 > 其它

Hibernate中HQL语言的一些例子

2011-06-30 17:10 260 查看
select count(c) from Company c;
select count(distinct c.creationDate) from Company c;
Integer count = (Integer)session.find("select count(distinct c) from Company c").get(0);

String query = "from Company c join fetch c.departments where c.name = :name";
Query q = session.createQuery(query);
q.setParameter("name", "alibaba");
Company c = (Company)q.list().get(0);
Set departments = c.getDepartments();
session.close();

select elements(c.departments) from Company c where c.name = :name;

select elements(d) from Company c join c.departments d where c.name = :name;

from Company c join c.departments d;

使用左连接:from Company c left join c.departments d;
from Company c left join c.departments d with d.name='技术部';

使用右连接:
from Company c right join c.departments d where c.name='alibaba';

FETCH连接
from Company c join fetch c.departments;

from Company c join c.departments d
生成的sql语句几乎一样,但是Hibernate执行该HQL得到的结果集不同

FETCH连接在以下几种情况下不能使用:
(1):不能使用Query.iterate()来获得结果集
(2):不能在分页方法中使用
(3):不能带with条件

from Company c where c.departments.name='技术部';

在实际应用中,出于性能和消除外键关联的考虑,通常不会在映射文件中将两个具有关联关系的对象映射起来,但是两个对象有相应的属性可以进行关系对应
此时可以使用交叉连接的方式:
select c from Company c, Departments d where c.id = d.companyId and d.name='技术部';

from Company c where c.departments.name='技术部';
查询的结果集相同

select d from Company c, Department d where d.company=c and c.name='alibaba' and d.name='技术部';

可以使用特殊属性size或者特殊函数size()测试一个集合的大小:
select size(c.departments) from Company c where c.name='alibaba';
或者:
select c.departments.size from Company c where c.name='alibaba';

from Company c order by c.creationDate, c.name, c.url
from Company c order by c.creationDate asc, c.name desc, url asc;

select c.name as name, size(c.departments) as e from Company c group by c.name;
select c.name as name, size(c.departments) as e from Company c group by c.name having c.name='alibaba';

子查询:
from Company c where not exists (from Department d where d.company=c);

批量更新和删除
批量更新:
String query = "update Company set name=:newname where name=:name";
Query query = session.createQuery(query);
query.setString("name", "alibaba");
query.setString("newname", "alibaba.com");
int rowCount = query.executeUpdate();
session.close();

批量删除:
String query = "delete from Company where name=:name");
Query q = session.createQuery(query);
query.setString("name", "alibaba");
int rowCount = query.executeUpdate();
session.close();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: