2016-05-12 52 views
2

我学习JPA和尝试下面的代码:JPA条件JOIN:{oj ...}在SQL中意味着什么?

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 = ?) 
+0

外部连接= oj –

回答

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方法联接的驱动器支持:supportsOuterJoinssupportsFullOuterJoins,并supportsLimitedOuterJoins

如今几乎所有的数据库都支持SQL标准的外部联接语法,所以大部分司机会直接删除解决这个问题的{oj}。然而,其他JDBC转义仍然有其地方来解决数据库之间的差异。

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

+0

自EclipseLink第一次从TopLink移植到EclipseLink以来,在EclipseLink中使用的H2Platform类看起来相当不变。我敢打赌,大多数TopLink并没有改变,以及关于禁止{oj ..}语法状态的一些方法的评论,并非所有的数据库/驱动程序都支持它。如果没有破裂,它不会受到关注。 – Chris