当不存在关联关系时,使用Hibernate JOIN FETCH

3
我有一个Customer实体,其中包含@OneToMany的Account子元素。 我想要执行fetch join,以返回具有相应活动账户(account.isActive = true)的客户。如果客户没有任何帐户,则也需要返回它。
对于以下JPQL,对于具有非活动帐户的客户,它们确实被过滤掉了,但没有任何帐户的客户未被返回:
   @NamedQuery(name = "Customer.findById", query = "SELECT c FROM Customer c LEFT JOIN FETCH c.accounts a WHERE c.id = :id AND a.isActive=true")

什么是编写查询的简洁方式,以便涵盖两种情况(没有账户的客户和有活动账户的客户)?

你已经定义了@OneToMany关系吗?也就是说,Customer是否有一个字段是:“private Set<Account> accounts”?如果是这样的话,你可以直接调用customer.getAccounts()。 - Ossin Java guy
我需要使用join fetch来在单个查询中检索父级和子级。我已经定义了关系。调用customer.getAccounts()稍后会发生,但它与问题无关(问题是关于JPQL/HQL的)。如果没有子级,则没有客户可以调用(因为它没有被检索到)。 - ReggieK123
2个回答

2
所以,基本上,回答我的问题 - 解决方案非常简单:
 @NamedQuery(name = "Customer.findById", query = "SELECT c FROM Customer c LEFT JOIN FETCH c.accounts a WHERE c.id = :id AND (a is null OR a.isActive=true)")

0
使用内部查询:
select c FROM Customer c LEFT JOIN FETCH (select a from accounts a WHERE a.isActive=true) WHERE c.id = :id

这个查询似乎不起作用(除了我修复的“where and”以外)- 我相信这对于JOIN会起作用,但JOIN FETCH则完全不同。在FETCH后左括号处得到“意外标记”。 - ReggieK123
它适用于我环境中拥有的实体。请发布您使用的实体的源代码。 - Ossin Java guy
这是您实际使用的查询吗:select c FROM Customer c LEFT JOIN FETCH (select a from accounts a WHERE a.isActive=true) WHERE c.id = :id - ReggieK123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接