Hibernate Set查询过虑

一个老师教许多学生,一个学生被许多老师教,一个学生有好多书,同一种书被许多同学拥有.
要查询教拥有书"a"的学生的老师!HQL如何写呀?如何取值?
class teacher{
String id;
String name;
Set students;
}
class student{
String id;
String name;
Set teachers;
Set books;
}
class book{
String id;
String name;
Set students;
}

 

================================

这种写法(t.students)肯定是可以的,你试试
SELECT t FROM teacher t join t.students s join s.books b where b.name = 'a'

================================

SELECT t FROM teacher t where t.students.books.name = 'a'   

首先students.books这里,students是集合,所以这个表达式是肯定不对的
同理books.name也不对

================================

SELECT t FROM Teacher t,Student s,Book b where s.id in elements(t.students) and b.id in elements(s.books)
这种方法没有出错!不过这种方式要用子查询!

================================

是的,element(Set)和indice(List)都可以取集合中的元素,但用在where子句的条件是需要数据库支持子查询,mysql就不行

另外t.students s中s并不是集合的意思,而是t的students对象的表别名,join t.students s这个hql,hibernate会翻译成两个表的内连接关系

================另一篇文章,和上面的结合就ok了================

 今天在做一个项目需要做到Set集的数据过虑,因为在获取一个User的时候不能将属于这个User的Knowledge全部取出,再一个一个地筛选符合条件的Knowledge,这样做会在很大的程度降底系统性能。

在 Hibernate中类型为Set、List的实体属性也是可以连接查询的,例如User里面有一个Set<Knowledge> knowledge属性要获取User中Knowledge的isShared的属性为true的User并且在返回的User中的knowledges 中包含isShared为true的Knowledge对象的时候,就要通Set的过虑查询(左连接查询),在hibernate3.2.3以后的写法如 下:
select distinct u from User u left join fetch u.knowledges k where k.isShare=true。
这样就只会获取knowledge的isShared为true的User,并且User里面的knowleges中包含knowledge的isShared为true的Knowlege对象。
需 要注意的是:关键字distinct和fetch。要实现上面的数据过虑就得要这两个关键字。第一个关键字是独立的意思,第二个关键字是以一条sql语句 执行。如果少了fetch这个关键字,则达不到目的。返回的结果是一个User包含isShared为true和false的knowledge集合。

同理,如果Knowledge里面还要Set、List属性,并且也要据根这些属性中的对象的某些属性约束查询的话(二级或三级连接查询),也是一样可以做到的。

转自:http://www.sxt.cn/u/571/blog/285



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值