检查JPA中列表中是否包含ID

时间:2012-08-24 11:01:18

标签: java sql jpa named-query

我有一个包含其他实体列表的实体。例如,它可能是具有Address实体列表的Person。地址并非特定于一个人。 (它实际上是与DB中间的连接表的多对多关系)

我正在搜索以尝试查找的所有人都拥有ID为X的地址

(这可能没有意义,因为这个例子很简单。在我的真实案例中它确实:))

通过命名查询:

SELECT p FROM Person p left join fetch p.addresses a WHERE p.addresses IS EMPTY OR a.id != :addressId

addressId是我传递的地址的ID

我的问题最好用一个例子来解释

  • 人1可能有地址1和地址2
  • 第2人可能有地址2
  • 第3人可能有地址3

现在是理想的结果

  • 如果我通过地址1然后我想要person2和person 3返回
  • 如果我通过地址3然后我想要person1和person 2返回
  • 如果我通过地址2然后我想要人3返回

目前,当我通过地址1时,我得到了全部三个。我认为这是因为人1也有地址2,这意味着它可以通过查询。

有没有人知道如何在列表中搜索id,如果它存在于任何元素中,那么不返回它?

希望这是有道理的。如果没有,我可以尝试提供更多细节

由于

2 个答案:

答案 0 :(得分:4)

您可以使用此查询:

select p from Person p where not exists 
(select a from Person pe left join pe.addresses a where p = pe and a.id = ?1)

答案 1 :(得分:1)

我想通过使用ID来检索实际实体,我找到了一种方法。然后我可以使用NOT MEMBER OF

例如,而不是这个

SELECT p FROM Person p left join fetch p.addresses a WHERE p.addresses IS EMPTY OR a.id != :addressId

我做

entityManager.find(Address.class, addressId);
SELECT p FROM Person p WHERE :address NOT MEMBER OF p.addresses 

我必须对entityManger.find进行额外调用,但我不必在JPQL中明确地进行连接。由于这个额外的电话,我不确定这是否效率更低。虽然方法略有不同,但确实解决了这个问题。

我仍然有兴趣看看是否可以使用id来完成...