2013-02-25 71 views
2

我写了一个JPQL声明,工会多个SELECT语句,每个选择不同的字符串常量。查询的简化版本如下所示:JPA只执行联合中的第一条select语句?

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数据库。

回答

3

JPQL没有这样的概念UNION。所以,因此,任何“查询”有它不是JPQL,因此应该予以拒绝为无效JPQL(其中DataNucleus JPA肯定会这么做)

+0

有趣。我想Hibernate会抱怨我。如果JPQL不处理工会,是否有替代方案可以达到类似的目的? – spaaarky21 2013-02-25 14:56:17

+0

是在同一继承树中的“WidgetA”和“WidgetB”?如果是这样,那么执行公共超类的JPQL,并且可能会发出UNION SQL语句。否则,只需发出两个JPQL查询并将结果合并到您的代码中 – DataNucleus 2013-02-25 15:16:09

+0

感谢您为查询中的联合以及建议设置了我。我现在还有其他问题,但对于这个问题他们有点偏离主题。我认为最好单独发布。 http://stackoverflow.com/questions/15080555/jpql-equivalent-of-sql-query-using-unions-and-selecting-constants – spaaarky21 2013-02-26 03:10:51

相关问题