检查 ID 是不是包含在 JPA 的列表中
Posted
技术标签:
【中文标题】检查 ID 是不是包含在 JPA 的列表中【英文标题】:Checking if ID contained in a list in JPA检查 ID 是否包含在 JPA 的列表中 【发布时间】:2012-08-24 11:01:18 【问题描述】:我有一个包含其他实体列表的实体。例如,它可以是具有地址实体列表的 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,如果它存在于任何元素中,则不返回它?
希望这是有道理的。如果没有,我可以尝试提供更多详细信息
谢谢
【问题讨论】:
【参考方案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)
【讨论】:
【参考方案2】:我想我已经找到了一种方法,即使用 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 来完成...
【讨论】:
以上是关于检查 ID 是不是包含在 JPA 的列表中的主要内容,如果未能解决你的问题,请参考以下文章
XSD 检查所有元素是不是在整个 XML 文件中包含相同的值