2012-05-15 38 views
0

如果我有两个实体类,GroupPerson,那里是GroupPerson(即一个人可以属于至多一个组之间的一个一对多的关系,一个组可以有很多人),我可以用什么jpql/hql查询来选择所有Person s不在Group s?JPA /休眠选择元素不收集

喜欢的东西的select p from Group g inner join g.people p反向...

回答

1

这工作:

select p from Person p where p not in (select pg from Group g inner join g.persons pg) 

可能:

select p from Person p where not exists (select 1 from Group g where p member of g.persons) 

是更有效率?

在任何情况下...欢迎评论哪些更有效,但是因为这两个“工作”,标记问题为回答。

1

如果你想拥有谁在给定的G团是不是所有的人,应该像

from Person p where p.group.id != :gid; 

并设置GID到给定组的ID。

如果你想有如果你想拥有谁是没有群等人所有的人谁是在没有组在所有

from Person p where p.group.id is null; 

所有的人,但有可能在人的外键一组ID不为空,但

from Person p where not exist (select 1 from Group g where g.id = p.group.id); 

PS我的语句是(如果该组没有删除在它的人,没有他们移动到不同的组中删除为例)不属于现有组HQL,但对于JPQL,它应该差不多一样。

+0

问题是关系是单向的。 'Person'没有对'Group'的引用,只是反过来。虽然HQL很好。编辑的问题来反映这一点。 – Tonio

+0

群体之间存在1:n的关系。然后在数据库中,表人员将组ID作为组的外键。通过正确的映射,可以在person实例中访问这个外键 - 可以使用多对一的关系,然后像在示例中那样使用'p.group.id',或者直接使用文字,然后使用。像'p.groupId'。如果外键尚未映射,那么我建议映射它 - 这比任何“不存在”或“不在”结构中的速度快得多。 – Johanna

+0

问题是集合是有序的,所以我需要一个连接表来跟踪订单索引,而不是简单地在'Person'中的'group id'列。 – Tonio