2016-02-12 126 views
2

我寫了一個複雜的JPA 2標準API查詢(我的供應商是的EclipseLink),在那裏我發現自己重新用一遍又一遍相同的子查詢。除非DB(Oracle)巧妙地執行某些操作,否則我認爲子查詢每次在查詢中找到時都會執行。我正在尋找一種方法來只執行一次子查詢。JPA標準連接查詢

我們有字段級的訪問,這意味着用戶可看到一個DB列,如果某些條件得到滿足。在下面的示例中,用戶具有如下訪問:

  • COLUMN_1是可見的,如果結果屬於類別1
  • COLUMN_2是可見的,如果結果屬於類別2
  • COLUMN_3是可見的,如果結果屬於類別1或類別2

這是一個僞查詢:

SELECT T.PK 
FROM MY_TABLE T 
WHERE 
(
    T.COLUMN_1 = 'A' 
    AND 
    T.PK IN (SELECT PKs of category 1) 
) 
AND 
(
    T.COLUMN_2 = 'B' 
    AND 
    T.PK IN (SELECT PKs of category 2) 
) 
AND 
(
    T.COLUMN_3 = 'C' 
    AND 
    (
     T.PK IN (SELECT PKs of category 1) 
     OR 
     T.PK IN (SELECT PKs of category 2) 
    ) 
) 

如果我想在SQL寫的手,我會通過外側連接兩個查詢,這樣寫:

SELECT T.PK 
FROM MY_TABLE T 
LEFT OUTER JOIN (SELECT PKs of category 1) IS_CAT_1 ON T.PK = IS_CAT_1.PK 
LEFT OUTER JOIN (SELECT PKs of category 2) IS_CAT_2 ON T.PK = IS_CAT_2.PK 
WHERE 
(
    T.COLUMN_1 = 'A' 
    AND 
    IS_CAT_1.RESULT = true 
) 
AND 
(
    T.COLUMN_2 = 'B' 
    AND 
    IS_CAT_2.RESULT = true 
) 
AND 
(
    T.COLUMN_3 = 'C' 
    AND 
    (
     IS_CAT_1.RESULT = true 
     OR 
     IS_CAT_2.RESULT = true 
    ) 
) 

我能加入一個查詢與該標準API的表?創建視圖將由我最後的選擇(數據庫不是由我維護)。

注意:我已經看到EclipseLink在JPQL(link)中提供了這種特定於供應商的支持,但我還沒有看到它可用於Criteria。

回答

0

最後,我們創建了一個數據庫查看,映射它作爲一個新的JPA實體,它加入到其他實體。