2016-05-12 10 views
2

Ich lerne JPA und versuchte, den folgenden Code:JPA-Kriterien JOIN: Was bedeutet {oj ...} in 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); 

So eine Person viele Kontakte hat. Der Code funktioniert. Ich benutze H2-Datenbank und EclipseLink. Allerdings kann ich nicht verstehen, was {oj...} in SQL bedeutet. Erkläre bitte.

Dies ist die erzeugte 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

Outer join = oj –

Antwort

3

Dies ist auf JPA oder SQL nicht spezifisch, aber es ist Teil der JDBC-Spezifikation ist. Die JDBC-Spezifikation enthält eine Anzahl von Escapes, die (potenzielle) Inkompatibilitäten zwischen SQL-Implementierungen beheben sollen. Von den Treibern wird erwartet, dass sie dies in das datenbankspezifische SQL übersetzen.

Die {oj <join-definition>} ist ein Escape für eine äußere Verbindung.

Zitat aus dem JDBC 4.2 specification Abschnitt 13.4.3 Outer Joins:

Outer-Joins ist eine erweiterte Funktion und werden nicht von allen Datenquellen unterstützt. Eine Erläuterung der Outer-Joins finden Sie in der entsprechenden SQL-Dokumentation.

Die Escape-Syntax für eine äußere Join ist:

{oj <outer-join>} 

wo <outer-join> die Form hat:

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

(Beachten Sie, dass geschweiften Klammern ({}) in der vorangehenden Zeile anzuzeigen, dass eine der Elemente zwischen ihnen müssen verwendet werden, sie sind nicht Teil der Syntax. Die folgende Anweisung SELECT verwendet die Escape-Syntax für einen äußeren Join.

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

Die JDBC-API stellt drei DatabaseMetaData Methoden für die Arten von Außen Bestimmung schließt sich eine Treiber unterstützt: supportsOuterJoins, supportsFullOuterJoins und supportsLimitedOuterJoins.

heute fast alle Datenbanken unterstützen die SQL-Standard äußere Join-Syntax, so dass die meisten Fahrer einfach die {oj und } um diese entfernen. Andere JDBC-Escapezeichen haben jedoch immer noch ihren Platz, um Unterschiede zwischen Datenbanken zu beheben.

Da eine JPA-Implementierung in der Regel die verwendete spezifische Datenbank kennt, hätte ich interessanterweise erwartet, dass dies datenbankspezifisches SQL generiert, anstatt das Formular mit JDBC-Escapezeichen zu verwenden.

+0

Die in EclipseLink verwendete H2Platform-Klasse scheint seit der ersten Portierung von TopLink nach EclipseLink relativ unverändert zu sein. Ich wette, es war für die meisten von TopLink unverändert, ebenso wie die Kommentare zu einigen Methoden, die den {oj ..} Syntax-Status deaktivieren, der nicht von allen Datenbank/Treibern unterstützt wird. Wenn es nicht kaputt ist, bekommt es keine Aufmerksamkeit. – Chris