JPA标准JOIN:{oj ...}在SQL中意味着什么?

时间:2016-05-12 14:52:40

标签: java sql jpa eclipselink h2

我学习了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 = ?)

1 个答案:

答案 0 :(得分:3)

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

{oj <join-definition>}是外部联接的转义。

引用JDBC 4.2 specification部分13.4.3外连接:

  

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

     

外部联接的转义语法是:

{oj <outer-join>}
     

其中<outer-join>的格式为:

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转义的表单。