JPA Criterios de API: LEFT JOIN para opcional relaciones

Estoy usando la API de Criterios, básicamente, de la primera vez. Se trata de la abstracción de consultas para un genérico generador:

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 );

    ...
}

La llamada criteriaQuery.from( genericClass ); genera SQL INNER JOIN para todas las relaciones se encuentran en la entidad de forma predeterminada. Este es un problema, porque la relación de cada ser null (DB NULL o un DB que no utilice claves externas y tiene una referencia no válida) aquellas entidades que aparecen en la lista de resultados, produciendo de forma efectiva mal de resultados de búsqueda.

Un ejemplo puede ser encontrado aquí: JPA Criterios de consulta Ruta.obtener left join es posible

De lo que me gustaría que suceder para que las consultas de crear instancias de esta clase/método es que todas las relaciones en la entidad, aquí genericClass, que se asignan como optional = true

@ManyToOne( FetchType.EAGER, optional = true )
@JoinColumn( name = "CLOSE_USER_ID", referencedColumnName = "USER_ID" )
private User              closer;

para generar un SQL LEFT (OUTER) JOIN en lugar de INNER JOIN.

Pregunta:

Hay estándar JPQ manera de hacer esto? Si es así, ¿cómo?

PS: no hay en general ninguna manera de saber el tipo concreto de antemano, por lo que la única manera en que yo podría ser capaz de conseguir lo que necesito es usar el metamodelo de algún tipo, y generar las combinaciones manualmente (que me gustaría evitar).


Estamos utilizando EclipseLink 2.3

OriginalEl autor Kawu | 2013-09-03

2 Kommentare

  1. 8

    .a partir de(clase) no utiliza una combinación INTERNA para todas las relaciones, no sólo las consultas de la clase.

    Una relación sólo se preguntó si el uso de la combinación() o fetch() de la API, el uso de una combinación externa usar join() con un JoinType.A la IZQUIERDA.

    https://en.wikibooks.org/wiki/Java_Persistence/Criteria#Join

    No estoy seguro de por qué usted está viendo une si no está realizando una llamada join(). Algunos JPA proveedores de unirse automáticamente a recuperar todas las GANAS de relaciones, esto puede ser lo que usted está viendo. Siempre he pesar de esta extraña, tal vez su JPA proveedor tiene una distancia de estar configurado para no hacer esto, o usted puede hacer que las relaciones PEREZOSO.

    Si mal no recuerdo, el problema era que estábamos usando izquierda sintaxis para unirse a la de las cláusulas, pero estaban utilizando el estándar une para el fin de bys, que parecía eclipsar el anterior izquierda se une.

    OriginalEl autor James

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea