3

我有一个包含其他实体列表的实体。例如,它可以是具有地址实体列表的 Person。这些地址并不特定于一个人。(它实际上是与数据库中间的连接表的多对多关系)

我正在搜索以尝试找到所有没有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,如果它存在于任何元素中,那么不返回它?

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

谢谢

4

2 回答 2

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)
于 2012-08-24T13:20:40.600 回答
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 来完成......

于 2012-08-24T11:17:39.113 回答