2017-03-17 325 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' 

然後你可以分別傳遞每個查詢,然後你可以將這些結果合併成一個結果。