【问题标题】:JPA only executes first select statement in union?JPA 只执行联合中的第一个选择语句?
【发布时间】:2013-02-10 07:59:23
【问题描述】:

我编写了一个联合多个 select 语句的 JPQL 语句,每个语句选择一个不同的字符串常量。查询的简化版本如下所示:

SELECT DISTINCT 'A' AS widget_type
  FROM WidgetA widgetA
  WHERE widgetA.creationTimestamp > :cutoff
UNION SELECT DISTINCT 'B' AS widget_type
  FROM WidgetB widgetB
  WHERE widgetB.creationTimestamp > :cutoff

查询不会导致任何错误,但我没有得到我期望的结果。我看到生成的 SQL 没有任何联合 - 它只从第一个选择中查询表:

select distinct 'A' as col_0_0_ 
from widget_a widget0_
where widget0_.creation_timestamp>?

JPA 在第一个 select 语句之后忽略所有内容是否有明显的原因?如果有什么不同的话,我使用 Hibernate 4.1.9 作为 JPA 实现,带有 MySQL 数据库。

【问题讨论】:

    标签: jpa jpql


    【解决方案1】:

    JPQL 没有 UNION 这样的概念。因此,任何具有它的“查询”都不是 JPQL,因此应该作为无效的 JPQL 被拒绝(DataNucleus JPA 肯定会这样做)

    【讨论】:

    • 有趣。我想 Hibernate 会抱怨我。如果 JPQL 不处理联合,是否有替代方案可以达到类似目的?
    • “WidgetA”和“WidgetB”在同一个继承树中吗?如果是这样,那么执行公共超类的 JPQL,您可能会收到一条 UNION SQL 语句。否则只需发出两个 JPQL 查询并将结果合并到您的代码中
    • 感谢您在查询中让我直接了解工会并提出建议。我现在还有其他问题,但对于这个问题来说,它们有点离题。我认为最好单独发布它们。 stackoverflow.com/questions/15080555/…
    • EclipseLink 在 JPQL 中支持 UNION,eclipse.org/eclipselink/documentation/2.4/jpa/extensions/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多