Я написал комплексный запрос API JPA 2 Criteria (мой провайдер - EclipseLink), где я снова и снова повторно использую один и тот же подзапрос. Если DB (Oracle) не делает что-то умное, я думаю, что подзапрос будет выполняться каждый раз, когда он будет найден в запросе. Я ищу способ выполнить подзапрос только один раз.JPA Критерии присоединения к запросу
У нас есть доступ на уровне поля, что означает, что пользователь имеет видимость для столбца БД, если выполняются определенные условия. В приведенном ниже пример, пользователь имеет следующие права доступа:
- 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, я написал бы его OUTER, соединяющую два запроса, как это:
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
)
)
Могу ли я присоединиться запрос в виде таблицы с Criteria API? Создание представления будет моим самым последним выбором (DB не поддерживается мной).
Примечание: Я видел, что EclipseLink предоставляет такую специфическую для поставщика поддержку в JPQL (link), но я не видел это доступным для критериев.