2013-10-08 79 views
0

我有3个名为Class,Person和PersonTalent的表。如何使用HQL INNERJOIN从多个表中检索记录

1.人员有人员ID和姓名。

2.类有人名单,每个人都有上述的id。

3.PersonTalent有人员ID和人员人才名称。

现在我想根据Person Talent Name从Class中检索记录列表。 我如何在HQL INNER JOIN中实现这一点。

我已经试过这样:

SELECT DISTINCT C FROM Class C, PersonTalent PT 
     INNER JOIN C.persons P 
     WHERE P.personId = PT.personId AND (PT.personId=1 AND PT.personTalentName='HQL') 

与上面的代码我得到它匹配PERSONID所有类对象,但我需要这两种人的身份证和人人才名相匹配的类对象的列表。

请帮我实现这一点。

问候, 拉哈西克哈

+0

为什么把你“P.personId = PT.personId和(PT.personId = 1。 ..)“这种personId将永远是1 –

+0

试试这个:DISTINCT C从类C JOIN C.persons P,PersonTalent PT WHERE P.personId = PT.personId和PT.personTalentName ='HQL' –

+0

@angel_navarro我想具有人才“HQL”以及人员ID匹配的人也是如此。 –

回答

0
select distinct c.* 
from Class c 
inner join person_talent pt on c.person_id=pt.person_id 
WHERE PT.personId=1 AND PT.personTalentName='HQL' 
0

IMHO,我定义一类实体而不映射集与DB。

在那之后,我会先写这样:

SELECT C FROM Class C 
WHERE EXISTS(
    SELECT 'X' FROM Person P, Persontalent PT 
    WHERE P.fkClass = C.id 
    AND P.personId = PT.personId 
    AND PT.personId = 1 
    AND PT.personTalentName = 'HQL' 
) 

这第一次查询后:

我会写第二个查询:

SELECT P 
FROM Person P, PersonTalent PT 
WHERE P.fkClass in (RESULT OF FIRST QUERY) 
AND P.personId = PT.personId 
AND PT.personId = 1 
AND PT.personTalentName = 'HQL' 

在此之后,我会写一种方法将第一个查询的结果(Class的列表)与第二个查询的结果(Person的列表链接到特定的类实例)的结果联系起来。

P.S.我想你的Person实体中有一个属性可以链接到Class实体(我已经命名为fkClass,但你知道确切的名字)