有一个Person类,它有一个成员变量Set<Hand> hands;这个set里可以是leftHand也可以是rightHand,也可以两个都有
我现在想查出来所有只有rightHand的Person,请问这样的HQL语句怎么写啊?Hibernate3.3

解决方案 »

  1.   

    from Person p right join fetch p.hands
      

  2.   

    你的意思我不是很明白,不过给你两个语句你参考一下:
    --这个是查询出来人
    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
      

  3.   

    你对 person 和hands表有什么关系  ???
      

  4.   

    LZ是不是要这样:
    from Person p right join fetch p.hands
      

  5.   

    我换个比较恰当的例子吧,Person类有Set<Toilet> toilets;既某人去过哪些厕所,Person和Toilet是双向多对多的关系,现在我需要通过Person查到所有去过Toilet t1这个厕所的人,这样的HQL语句怎么写啊?
      

  6.   

    select p from Person p where exists (select 1 from Toilet h where h.person.id = p.id 
    and h.isGO= '去过') 就这样写就行了
      

  7.   

    子句里的select 1是什么用法,什么意思啊、、、
      

  8.   

    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
      

  9.   

    Person 和 Toilet是双向多对多,select h.person.id from Toilet h where h.isGO= '去过'这句不行吧,Toilet里有一个Set<Person>,而不是一个Person
      

  10.   

    select p from Person p where exists (select 1 from Toilet h where h.person.id = p.id 
    and h.isGO= '去过')
    用这句:
      

  11.   

    where h.person.id = p.id问题是h里根本没有person这个属性,只有Set<Person> persons
      

  12.   

    我把问题整理一下:我用的是Hibernate,现在我需要些一个查询,需求如下:
    Person类和Toilet(厕所)类,他们是双向多对多,既一个人可能去过多个厕所,而一个厕所也对应多个人。
    Person中有Set<Toilet> toilets这样一个成员变量,而Toilet类里有Set<Person> persons这样一个成员变量,我现在要在Person中查到去过一个特定厕所的人,既去过去过Toilet t1这个厕所的人,现在要求必须用HQL方式查询,请问这个HQL语句怎么写 
      

  13.   

    select distinct p from Person p,Toilet t where  p in elements(t.persons) and t.isGO='去过'
    你这样看看
      

  14.   

    PERSON表里有PERSON_ID字段
    中间表PERSON_TOILET表里有PERSON_ID 和TOILET_ID两个字段
    TOILET表里有TOILET_ID字段
      

  15.   

    是多对多的话就好办了:select p from Person p join p.toilets t where :t1 member of t
      

  16.   

    应该是这个:select p from Person p where :t member of p.toilets
      

  17.   

    一个人可能去同一个厕所多次么?LZ可以尝试用下连接语句 这是可以办到的 比如from Person person left join person.toilets toilets where toilets.xxx = xxx大概是这个意思吧 我不经常用连接语句 所以不咋会 LZ你可以实验下 
      

  18.   

    select *from person p 
    jion person_toilet pt
    on p.personid=pt.personid
    join toilet t
    on t.toiletid=pt.toiletid
    where t.toiletname=t1
      

  19.   

    from Person p right join fetch p.hands
      

  20.   

    ejbql的写法
    from Person s where s.hands.rightHand