我学习了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 = ?)发布于 2016-05-12 15:05:29
这并不是JPA或SQL特有的,但它是JDBC规范的一部分。JDBC规范包含了许多转义,旨在解决SQL实现之间的(潜在)不兼容问题。驱动程序应该将其转换为特定于数据库的SQL。
{oj <join-definition>}是外部连接的转义。
引用JDBC 4.2规范第13.4.3节外连接:
外部联接是一个高级特性,并非所有数据源都支持。有关外部联接的解释,请参阅相关的SQL文档。 外部联接的转义语法是: {oj ] 其中,
<outer-join>具有以下形式: 表{在搜索条件上{表\}的左侧\右\FULL} (请注意,前一行中的大括号({})表示必须使用它们之间的一项;它们不是语法的一部分。)下面的SELECT语句对外部联接使用转义语法。 语句stmt = con.createStatement();stmt.executeQuery("SELECT * FROM {oj TABLE1“+”左外部联接TABLE2 ON DEPT_NO = 003420930}"); JDBC提供了三种DatabaseMetaData方法来确定驱动程序支持的外部连接类型:supportsOuterJoins、supportsFullOuterJoins和supportsLimitedOuterJoins。
现在,几乎所有数据库都支持SQL标准的外部联接语法,因此大多数驱动程序只需删除{oj和}。然而,其他JDBC转义仍然有自己的位置来解决数据库之间的差异。
有趣的是,由于JPA实现通常知道正在使用的特定数据库,因此我希望这将生成特定于数据库的SQL,而不是使用JDBC转义的表单。
https://stackoverflow.com/questions/37190529
复制相似问题