2017-03-17 3668 views
0

我的问题是我如何在JPA中执行UNION ALL子句? 是否可以使用@NamedQuery?这个查询中使用2代表在每个SELECT语句并在结束它使用顺序以时间BY如何在JPA中使用UNION ALL?

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; 
+0

你没有。 JPQL中没有这样的东西。 –

+0

那么有没有办法在jpa中做到这一点? –

+0

JPA允许您使用SQL查询,然后丢弃数据库独立性。 –

回答

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

分别使用每个查询。像

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' 

然后你可以分别传递每个查询,然后你可以将这些结果合并成一个结果。