JPA条件联接查询

马科斯·弗拉格卡基斯(Markos Fragkakis)

我编写了一个复杂的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
    )
)

我可以使用Criteria API将查询作为表格加入表格吗?创建视图将是我的最后选择(数据库不是由我维护)。

注意:我已经看到EclipseLink在JPQL(link)中提供了这种特定于供应商的支持,但是我还没有看到Criteria可用的支持。

马科斯·弗拉格卡基斯(Markos Fragkakis)

最后,我们创建了一个数据库视图,将其映射为新的JPA实体,并将其连接到其他实体。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章