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

Schreibe einen Kommentar