JPA Criteria API: LEFT JOIN für optionale Beziehungen
Ich bin mit den Kriterien-API im Grunde das erste mal. Es geht um die Abstraktion von Abfragen für eine generische generator:
public TypedQuery<T> newQuery( Manager<?,T> manager )
{
CriteriaBuilder builder = this.entityManager.getCriteriaBuilder();
Class<T> genericClass = ( Class<T> ) ( ( ParameterizedType ) manager.getClass().getGenericSuperclass() ).getActualTypeArguments()[1];
CriteriaQuery<T> criteriaQuery = builder.createQuery( genericClass );
Root<T> root = criteriaQuery.from( genericClass );
...
}
Den Anruf criteriaQuery.from( genericClass );
generiert die SQL - INNER JOIN
für alle Beziehungen gefunden, die auf die Einheit standardmäßig. Dies ist ein problem, weil jede Beziehung, die wird null (DB NULL
oder eines DB, der nicht mit foreign keys und hat eine ungültige Referenz) diese Entitäten fehlt in der Liste, effektiv zu produzieren falsche Suchergebnisse.
Ein Beispiel finden Sie hier: JPA Criteria-Abfrage Weg.Holen Sie left join ist es moeglich
Was ich gerne sehen würde für Anfragen instanziiert diese Klasse/Methode ist, dass alle Beziehungen auf die Person, hier genericClass
, zugeordnet sind, wie optional = true
@ManyToOne( FetchType.EAGER, optional = true )
@JoinColumn( name = "CLOSE_USER_ID", referencedColumnName = "USER_ID" )
private User closer;
zur Generierung einer SQL - LEFT (OUTER) JOIN
statt INNER JOIN
.
Frage:
Ist es standard JPQ Weg, um dies getan? Wenn ja, wie?
PS: es gibt in der Regel keine Möglichkeit zu wissen, den konkreten Typ vorher, so dass der einzige Weg, ich könnte in der Lage sein zu erreichen, was ich brauche, ist zu verwenden das metamodel von einer Art, und generieren Sie die Verknüpfungen manuell (was möchte ich vermeiden).
Sind wir mit EclipseLink 2.3
InformationsquelleAutor Kawu | 2013-09-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
.von (- Klasse) nicht ein INNER join für alle Beziehungen, es fragt nur die Klasse.
Einer Beziehung wird nur abgefragt werden, wenn Sie die join() oder fetch () - API, die Verwendung eines outer-Joins verwenden von join() mit einem JoinType.LINKS.
https://en.wikibooks.org/wiki/Java_Persistence/Criteria#Join
Ich bin nicht sicher, warum Sie zu sehen sind, gesellt, wenn Sie nicht den Aufruf join(). Einige JPA-Providern automatisch join-fetch-alle BEGIERIG, Beziehungen, dies kann sein, was Sie sehen. Ich habe aber immer diese sonderbare, vielleicht ist dein JPA-provider hat einen Weg konfiguriert werden, dies nicht zu tun, oder Sie können die Beziehungen zu FAUL.
InformationsquelleAutor James
Ich hatte das gleiche Problem...
Nach den Ermittlungen die Schlussfolgerung ist, Dass Sie hâve zu handhaben, mit left join in deine jpql
Siehe:
http://www.objectdb.com/java/jpa/query/jpql/path#Navigation_through_a_NULL_value_
InformationsquelleAutor Steph