JPA Criteria 连接查询
JPA Criteria join query
我编写了一个复杂的 JPA 2 Criteria API 查询(我的提供商是 EclipseLink),我发现自己一遍又一遍地重复使用相同的子查询。除非DB(Oracle)做了一些聪明的事情,否则我认为每次在查询中找到子查询都会执行。我正在寻找一种只执行一次子查询的方法。
我们拥有字段级访问权限,这意味着如果满足特定条件,用户可以查看数据库列。在下面的示例中,用户具有以下访问权限:
如果结果属于类别 1,则 - COLUMN_1 可见
如果结果属于类别 2
,则 - COLUMN_2 可见
如果结果属于类别 1 或类别 2,
- COLUMN_3 可见
这是一个伪查询:
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 JOINing 两个查询来编写,如下所示:
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
)
)
我可以将查询作为 table 加入标准 API 吗?创建视图是我最后的选择(数据库不是由我维护的)。
注意:我已经看到 EclipseLink 在 JPQL (link) 中提供了这种特定于供应商的支持,但我还没有看到它可用于 Criteria。
最后,我们创建了一个 DB View,将其映射为一个新的 JPA 实体并将其加入到其他实体。
我编写了一个复杂的 JPA 2 Criteria API 查询(我的提供商是 EclipseLink),我发现自己一遍又一遍地重复使用相同的子查询。除非DB(Oracle)做了一些聪明的事情,否则我认为每次在查询中找到子查询都会执行。我正在寻找一种只执行一次子查询的方法。
我们拥有字段级访问权限,这意味着如果满足特定条件,用户可以查看数据库列。在下面的示例中,用户具有以下访问权限:
-
如果结果属于类别 1,则
- COLUMN_1 可见 如果结果属于类别 2 ,则
- COLUMN_2 可见 如果结果属于类别 1 或类别 2,
- COLUMN_3 可见
这是一个伪查询:
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 JOINing 两个查询来编写,如下所示:
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
)
)
我可以将查询作为 table 加入标准 API 吗?创建视图是我最后的选择(数据库不是由我维护的)。
注意:我已经看到 EclipseLink 在 JPQL (link) 中提供了这种特定于供应商的支持,但我还没有看到它可用于 Criteria。
最后,我们创建了一个 DB View,将其映射为一个新的 JPA 实体并将其加入到其他实体。