【问题标题】:HQL - COALESCE or CASE on LEFT JOINHQL - LEFT JOIN 上的 COALESCE 或 CASE
【发布时间】:2021-12-07 12:19:26
【问题描述】:

我有 4 张桌子:

job
client
order
client
client
state
state
name

我需要从 joborder 中获取客户的州名。如果 job not null 从 job 中获取,否则从 order 中获取。

我尝试过这样的事情:

LEFT JOIN job.client jc
LEFT JOIN order.client oc
LEFT JOIN COALESCE(jc.state, oc.state) clientState

但我得到一个 unexpected token: COALESCE 异常。

我也试过了:

LEFT JOIN job.client jc
LEFT JOIN order.client oc
LEFT JOIN CASE WHEN job IS NOT NULL THEN jc.state ELSE oc.state END clientState

但我得到一个 unexpected token: CASE 异常。

关于如何解决这个问题的任何想法?我应该尝试使用状态表(jc.state 和 oc.state)进行多个 JOINS 并在投影中使用 CASE 吗?没有更简单的方法吗?

提前致谢

额外信息:

这个查询可以像下面的例子那样解决。我的主要问题是是否有更好的方法来做到这一点:

SELECT CASE WHEN jcClientState IS NOT NULL THEN jcClientState.code ELSE ocClientState.code END 
FROM job job
LEFT JOIN anotherTable anotherTable
LEFT JOIN job.client jc
LEFT JOIN anotherTable.order oc
LEFT JOIN jc.state jcClientState 
LEFT JOIN oc.state ocClientState

【问题讨论】:

  • 您好,您要执行的查询对我来说不是很清楚。您的 WHERE 是针对特定订单/工作还是针对客户,还是要列出所有具有客户状态的订单和工作?
  • 我需要所有客户的州名。这里没有 WHERE 子句。在我的模型中,有时工作会为空,所以我从订单中获取客户。我在帖子中添加了一些额外的信息。
  • 如果您认为问题仍然令人困惑,我将删除此帖子。也许我无法很好地阐述问题
  • select coalesce(table1.state, table2.state) from table 1 left join table 2.
  • @隔离。那正是我所想。没有办法将它添加到 JOIN 中,对吧?!请详细说明您的答案,不要将其视为评论,我会接受。

标签: java sql hibernate jpa hql


【解决方案1】:

假设 HQL 支持合并(在进行快速搜索时显示为这样),那么您可以像这样使用合并:

    select coalesce(table1.state, table2.state, 'unknown') as state
    from table1
    left join table 2
      on table2.id = table1.id

合并将获取第一个非空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    相关资源
    最近更新 更多