我学习了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 = ?)
答案 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
方法,用于确定驱动程序支持的外连接类型:supportsOuterJoins
,supportsFullOuterJoins
和supportsLimitedOuterJoins
。
现在几乎所有数据库都支持SQL标准外连接语法,因此大多数驱动程序只会删除{oj
和}
。但是,其他JDBC转义仍然可以解决数据库之间的差异。
有趣的是,由于JPA实现通常知道正在使用的特定数据库,我希望这可以生成特定于数据库的SQL,而不是使用带有JDBC转义的表单。