【问题标题】:JPA Criteria join queryJPA 标准连接查询
【发布时间】:2016-05-23 21:06:42
【问题描述】:

我编写了一个复杂的 JPA 2 Criteria API 查询(我的提供者是 EclipseLink),我发现自己一遍又一遍地重复使用相同的子查询。除非数据库(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 JOIN 两个查询来编写,如下所示:

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。

【问题讨论】:

    标签: jpa eclipselink jpa-2.0 criteria


    【解决方案1】:

    最后,我们创建了一个 DB 视图,将其映射为一个新的 JPA 实体并将其加入到其他实体中。

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      • 2017-03-13
      • 1970-01-01
      • 2012-04-01
      相关资源
      最近更新 更多