我的问题是如何在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;

最佳答案

由于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?)。

09-10 07:05
查看更多