如何在JPA中使用UNION ALL?

时间:2017-03-17 14:55:42

标签: java sql hibernate jpa

我的问题是我如何在JPA中执行UNION ALL子句? 可以使用@NamedQuery吗?此查询在每个SELECT语句中一次使用2个表,最后使用ORDER BY

    SELECT 0 as intorder, u.id, q.order_type
      FROM test_union u, test_query q
     WHERE u.id     = q.id
       AND u.type   is NULL
       AND q.field1 = 'DEFAULTS'
UNION ALL
  SELECT 1 as intorder, u.id, q.order_type
      FROM test_union u, test_query q
     WHERE u.id     = q.id
       AND u.type   is NOT NULL
       AND q.field1 = 'TESTING'
 UNION ALL
  SELECT 2 as intorder, u.id, q.order_type
      FROM test_union u, test_query q
     WHERE u.id     = q.id
       AND u.type   is NULL
       AND q.field1 = 'DEFAULTS'
ORDER BY intorder, q.order_type;

2 个答案:

答案 0 :(得分:1)

由于Jpql和Hql(一个是另一个的子集,JPA使用Jpql)不支持 UNION ,因此您需要使用适合您的数据库查询语言的本机查询。实现可能如下所示:

@Entity
@NamedNativeQuery(
    name="EntityClassName.functionName"
    , query="SELECT .. "
        + "UNION ALL "
        + "SELECT .."
    , resultClass=YourResultClass.class`
) 

直接在您的一个实体和您的存储库界面中:

public interface EntityClassNameRepository extends JpaRepository<EntityClassName, Long> {

    @Query(nativeQuery = true)
    List<YourResultClass> functionName(parameter list)

当我做同样的事情YourResultClass需要成为一个实体时。

另一个解决方案是将UNION从数据库中提取到JVM中,其中多个查询结果会增强列表。之后,列表也可以进行排序(How to sort a ArrayList in Java?)。

答案 1 :(得分:0)

单独使用每个查询。喜欢

SELECT 0 as intorder, u.id, q.order_type
      FROM test_union u, test_query q
     WHERE u.id     = q.id
       AND u.type   is NULL
       AND q.field1 = 'DEFAULTS'

然后您可以单独传递每个查询,然后您可以将这些结果合并到一个结果中。