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。