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

Java 检查JPA中的列表中是否包含ID,java,sql,jpa,named-query,Java,Sql,Jpa,Named Query,我有一个包含其他实体列表的实体。例如,它可以是具有地址实体列表的人。这些地址不是特定于一个人的。(实际上它与DB中的连接表的多对多关系) 我正在进行搜索,试图找到所有没有id为X的地址的人 (这可能没有意义,因为这个例子很琐碎。在我的现实世界中是这样的:) 按命名查询是: SELECT p FROM Person p left join fetch p.addresses a WHERE p.addresses IS EMPTY OR a.id != :addressId addressId是

我有一个包含其他实体列表的实体。例如,它可以是具有地址实体列表的人。这些地址不是特定于一个人的。(实际上它与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
  • 第三人可能有地址3
现在是期望的结果

  • 如果我传入地址1,那么我希望返回人员2和人员3
  • 如果我传入地址3,那么我希望返回人员1和人员2
  • 如果我传入地址2,那么我希望返回人3
目前,当我通过地址1,我得到所有三个回来。我认为这是因为person1还有地址2,这意味着它通过了查询

是否有人知道如何在列表中搜索id,如果它存在于任何元素中,则不会返回它

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


谢谢

我想我已经找到了一种方法,通过使用ID来检索实际的实体。然后我可以使用非成员

举个例子,而不是这个

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

我必须对entityManger.find执行额外的调用,但我不必在JPQL中显式地执行连接。我不确定这是否因为这个额外的电话而更低效。它确实解决了这个问题,尽管方法略有不同


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

您可以使用以下查询:

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)
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)