你的意思我不是很明白,不过给你两个语句你参考一下: --这个是查询出来人 select p from Person p where exists (select 1 from Hand h where h.person.id = p.id and h.hand = rightHand) --这个查询出符合rightHand的数据,在你的Hand里想必也有person变量,这个就可以取出这些人 select h from Hand h where h.hand = rightHand
select p from Person p where exists (select 1 from Toilet h where h.person.id = p.id and h.isGO= '去过') 就这样写就行了
子句里的select 1是什么用法,什么意思啊、、、
select p from Person p where exists (select 1 from Toilet h where h.person.id = p.id and h.isGO= '去过') 这句话等于: select p from Person p where p.id in (select h.person.id from Toilet h where h.isGO= '去过') 使用exists的性能比in的性能高,oracle里的使用exists,里面子句已经有h.person.id = p.id 所以我们可以不管他的结果集,就给他一个常量了,其实你给他什么都无所谓select 1 from dual
Person 和 Toilet是双向多对多,select h.person.id from Toilet h where h.isGO= '去过'这句不行吧,Toilet里有一个Set<Person>,而不是一个Person
select p from Person p where exists (select 1 from Toilet h where h.person.id = p.id and h.isGO= '去过') 用这句:
where h.person.id = p.id问题是h里根本没有person这个属性,只有Set<Person> persons
--这个是查询出来人
select p from Person p where exists (select 1 from Hand h where h.person.id = p.id
and h.hand = rightHand)
--这个查询出符合rightHand的数据,在你的Hand里想必也有person变量,这个就可以取出这些人
select h from Hand h where h.hand = rightHand
from Person p right join fetch p.hands
and h.isGO= '去过') 就这样写就行了
and h.isGO= '去过')
这句话等于:
select p from Person p where p.id in (select h.person.id from Toilet h where h.isGO= '去过')
使用exists的性能比in的性能高,oracle里的使用exists,里面子句已经有h.person.id = p.id 所以我们可以不管他的结果集,就给他一个常量了,其实你给他什么都无所谓select 1 from dual
and h.isGO= '去过')
用这句:
Person类和Toilet(厕所)类,他们是双向多对多,既一个人可能去过多个厕所,而一个厕所也对应多个人。
Person中有Set<Toilet> toilets这样一个成员变量,而Toilet类里有Set<Person> persons这样一个成员变量,我现在要在Person中查到去过一个特定厕所的人,既去过去过Toilet t1这个厕所的人,现在要求必须用HQL方式查询,请问这个HQL语句怎么写
你这样看看
中间表PERSON_TOILET表里有PERSON_ID 和TOILET_ID两个字段
TOILET表里有TOILET_ID字段
jion person_toilet pt
on p.personid=pt.personid
join toilet t
on t.toiletid=pt.toiletid
where t.toiletname=t1
from Person s where s.hands.rightHand