2012-01-09 17 views
7

Estoy usando JPA2 con su API de Criteria para seleccionar mis entidades de la base de datos. La implementación es OpenJPA en WebSphere Application Server. Todas mis entidades están modeladas con Fetchtype = Lazy.jpa lazy fetch entidades sobre múltiples niveles con criterios api

Selecciono una entidad con algunos criterios de la base de datos y deseo cargar todos los datos anidados de las tablas secundarias a la vez. Si tengo un modelo de datos, donde se unió a OneToMany tabla A a la tabla B, puedo utilizar una cláusula de Fetch en mi consulta criterios:

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<A> cq = cb.createQuery(A.class); 
Root<A> root = cq.from(A.class); 
Fetch<A,B> fetch = root.fetch(A_.elementsOfB, JoinType.LEFT); 

Esto funciona bien. Obtengo un elemento A y todos sus elementos de B se rellenan correctamente. Ahora la tabla B tiene una relación oneToMany con la tabla C y quiero cargarlos también. Así que añadir la siguiente declaración a mi consulta:

Fetch<B,C> fetch2 = fetch.fetch(B_.elementsOfC, JoinType.LEFT); 

Pero esto no haré nada.

¿Alguien sabe cómo buscar entidades de múltiples niveles en una consulta?

Respuesta

10

No funciona con JPQL y tampoco hay forma de que funcione en CriteriaQueries. Los límites de especificación fue a buscar las entidades a las que en las que hace referencia directamente de la entidad devuelto:

Acerca buscar a unirse con CriteriaQuery:

An association or attribute referenced by the fetch method must be referenced from an entity or embeddable that is returned as the result of the query.

Sobre podido ir a unirse en JPQL:

The association referenced by the right side of the FETCH JOIN clause must be an association or ele ment collection that is referenced from an entity or embeddable that is returned as a result of the query.

misma limitación es también contado en la documentación de OpenJPA.

+0

Muchas gracias por su respuesta. Pero hay un ejemplo de JPQL en el artículo de documentación que apuntó: 'SELECT x FROM Magazine x join fetch x.articles a join buscar a.publishers p WHERE x.title = 'JDJ'' Hay tablas x, a y p con las relaciones x-> a y a-> p. Esto es exactamente lo que quiero hacer con la API de criterios. –

+0

No lo leíste muy cuidadosamente. Es un ejemplo de consulta que causa un error de sintaxis. La oración anterior a esa consulta es: "La siguiente consulta dará como resultado un error de sintaxis:". Lo que quieres hacer no funciona. –

+3

Oh, tienes razón. Entonces solo puedo decir: Ooops. Pero de todos modos ... ¿Hay alguna práctica que pueda resolver ese problema? Creo que hay muchas personas en este mundo que quieren buscar más de dos mesas. ¿Tengo que unirme primero a la segunda tabla o debo leer los otros datos manualmente? ¿Cuál es la mejor práctica para eso? –

Cuestiones relacionadas