【问题标题】:JPA criteria JOIN: what does {oj ...} mean in SQL?JPA 标准 JOIN:SQL 中的 {oj ...} 是什么意思?
【发布时间】:2016-09-08 12:01:46
【问题描述】:

我学习了JPA并尝试了以下代码:

CriteriaBuilder queryBuilder = em.getCriteriaBuilder();
CriteriaQuery<PersonDI> criteriaQuery = queryBuilder.createQuery(PersonDI.class);
Root<PersonDI> personDI = criteriaQuery.from(PersonDI.class);
Fetch<PersonDI, ContactDI> contactDI = personDI.fetch("contacts", JoinType.LEFT);
criteriaQuery.where(queryBuilder.equal(personDI.get("guid"), guids.get(0)));
criteriaQuery.select(personDI).distinct(true);
TypedQuery<PersonDI> query = em.createQuery(criteriaQuery);

所以一个人有很多联系人。代码正在运行。我使用 H2 数据库和 EclipseLink。但是,我无法理解{oj...} 在 SQL 中的含义。请解释一下。

这是生成的 SQL:

SELECT DISTINCT t1.col0, t1.col3, t1.col1, t1.col2, t0.col0, t0.col2 FROM {oj tbl0 t1 LEFT OUTER JOIN tbl1 t0 ON (t0.col1 = t1.col0)} WHERE (t1.col0 = ?)

【问题讨论】:

    标签: java sql jpa eclipselink h2


    【解决方案1】:

    这并不特定于 JPA 或 SQL,但它是 JDBC 规范的一部分。 JDBC 规范包含许多转义,旨在解决 SQL 实现之间的(潜在)不兼容问题。驱动程序应将其转换为特定于数据库的 SQL。

    {oj &lt;join-definition&gt;} 是外连接的转义。

    引用 JDBC 4.2 specification 第 13.4.3 节外连接:

    外部联接是一项高级功能,并非所有数据源都支持。有关外连接的说明,请参阅相关 SQL 文档。

    外连接的转义语法是:

    {oj <outer-join>}
    

    &lt;outer-join&gt; 的格式为:

    table {LEFT|RIGHT|FULL} OUTER JOIN {table | <outer-join>} ON search-condition
    

    (请注意,前一行中的花括号 ({}) 表示必须使用它们之间的一项;它们不是语法的一部分。)以下SELECT 语句使用转义语法来表示外连接。

    Statement stmt = con.createStatement();
    stmt.executeQuery("SELECT * FROM {oj TABLE1 " +
            "LEFT OUTER JOIN TABLE2 ON DEPT_NO = 003420930}");
    

    JDBC API 提供了三种DatabaseMetaData 方法来确定驱动程序支持的外连接类型:supportsOuterJoinssupportsFullOuterJoinssupportsLimitedOuterJoins

    现在几乎所有的数据库都支持 SQL 标准外连接语法,所以大多数驱动程序会简单地删除 {oj}。然而,其他 JDBC 转义仍然可以解决数据库之间的差异。

    有趣的是,由于 JPA 实现通常知道正在使用的特定数据库,我本来希望这会生成特定于数据库的 SQL,而不是使用带有 JDBC 转义的表单。

    【讨论】:

    • EclipseLink 中使用的 H2Platform 类似乎几乎没有改变,因为它首先从 TopLink 移植到 EclipseLink。我敢打赌,对于大多数 TopLink 以及禁用 {oj..} 语法状态的某些方法的 cmets 来说,并非所有数据库/驱动程序都支持它。如果它没有损坏,就不会引起注意。
    猜你喜欢
    • 2019-07-11
    • 1970-01-01
    • 2012-05-20
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 2014-06-30
    • 1970-01-01
    相关资源
    最近更新 更多