2016-05-12 54 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