我有一个包含其他实体列表的实体。例如,它可能是具有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,这意味着它可以通过查询。
有没有人知道如何在列表中搜索id,如果它存在于任何元素中,那么不返回它?
希望这是有道理的。如果没有,我可以尝试提供更多细节
由于
答案 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来完成...