【问题标题】:Hibernate JOIN FETCH when no relation exists不存在关系时休眠 JOIN FETCH
【发布时间】:2017-10-29 17:08:52
【问题描述】:

我有一个带有@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 关系?也就是说,客户是否有一个字段:“private Set accounts”?如果是这样,您可以调用 customer.getAccounts()
  • 我需要 join fetch 以便在一次选择中检索父项和子项。我确实定义了这种关系。无论如何,稍后都会调用 customer.getAccounts(),但它与问题无关(关于 JPQL/HQL)。在没有孩子的情况下,没有客户可以调用(未检索到)

标签: hibernate join where fetch


【解决方案1】:

所以,基本上,回答我自己的问题 - 解决方案非常简单:

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

【讨论】:

    【解决方案2】:

    使用内部查询:

    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 之后在左括号中获取“意外令牌”
    • 它适用于我环境中的实体。贴出你使用的实体的源代码。
    • 这是您使用的实际查询吗:select c FROM Customer c LEFT JOIN FETCH (select a from accounts a WHERE a.isActive=true) WHERE c.id = :id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    相关资源
    最近更新 更多