2016-05-12 27 views
2

私はJPAを学び、次のコードを試してみました:だから1人が、多くの接点を持っている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ドキュメントを参照してください。

外側のエスケープ構文をジョインである:

<outer-join>フォーム有する
{oj <outer-join>} 

table {LEFT|RIGHT|FULL} OUTER JOIN {table | <outer-join>} ON search-condition 

は、(前の行に中括弧({}が)の1つを示していることに注意してくださいそれらの間の項目は使用する必要があり、構文の一部ではありません)。次のSELECTステートメントは、外部結合にエスケープ構文を使用します。 supportsOuterJoinssupportsFullOuterJoins、およびsupportsLimitedOuterJoins

Statement stmt = con.createStatement(); 
stmt.executeQuery("SELECT * FROM {oj TABLE1 " + 
     "LEFT OUTER JOIN TABLE2 ON DEPT_NO = 003420930}"); 

JDBC APIには、ドライバがサポートする外部結合の種類を決定するための3つのDatabaseMetaDataメソッドを提供します。ほとんどのドライバーは、単にこの周り{oj}に削除されますので、

は今日では、ほぼすべてのデータベースは、SQL標準外結合構文をサポートしています。しかし、他のJDBCエスケープには依然としてデータベース間の違いに対処するための場所があります。

興味深いことに、JPAの実装では通常、使用されている特定のデータベースが分かっているため、JDBCエスケープでフォームを使用する代わりに、データベース固有のSQLを生成すると予想していました。

+0

EclipseLinkで使用されているH2Platformクラスは、TopLinkからEclipseLinkに最初に移植されて以来、かなり変化していないようです。ほとんどのTopLinkと、一部のメソッドで{oj ..}構文状態を無効にしているコメントについては、すべてのデータベース/ドライバでサポートされているわけではありません。それが壊れていなければ、それは注目を集めない。 – Chris

関連する問題