Pregunta

Esto podría ser una respuesta muy fácil, ya que estoy seguro que no es poco común. Veo algunas preguntas similares, pero nada de lo que parece describir mi problema.

Me tiene dos objetos: un coche y la persona. Están en una relación de muchos a muchos, es decir, un coche puede ser propiedad de varias personas, y una persona puede poseer varios coches. Car tiene un conjunto perezosamente inicializado de Drivers:

@ManyToMany(targetEntity=Person.class, fetch=FetchType.LAZY)
private Set<Person> people;

Quiero encontrar todos los coches azules con los propietarios menores de 25:

Criteria foo = persistenceManager.createCriteria(Car.class, "myCarAlias");
Criteria bar = foo.createCriteria("drivers", "myDriverAlias");
//add restrictions on foo and bar for blue and age, respectively
baz = foo.list();

Mi problema es cuando iterar a través de la lista y llamada getDrivers() en cada coche, se inicializa la recogida y obtiene todos los conductores de ese coche. Supongo que el RAN .list() que no establece los resultados de cada vehículo.

regrese los resultados que cabe esperar si funciono manualmente el SQL hibernación es generar, así que estoy razonablemente seguro de los criterios no es el problema.

Me puede entender por qué sucede esto, pero no estoy seguro de cómo llegar a su alrededor, sin iterar sobre cada vehículo y ejecutar una consulta para los conductores en cada uno. Me gustaría evitar hacerlo si es posible y agradecería cualquier consejo.

Gracias de antemano!

¿Fue útil?

Solución

¿Esperabas que la colección de controladores para cada coche sólo contendría Las personas que coinciden con sus criterios (es decir, son más de 25)? En otras palabras, no desea que la colección de controladores que contiene las personas que son mayores de 25 años?

Si ese es el caso, entonces usted tendrá que utilizar un ResultTransformer (ver sección 15.4 de la documentación Hibernate) porque Hibernate no pre-filtro de colecciones antes de devolver los resultados.

Sin embargo, si el problema es la colección de controladores está siendo cargado ligeramente y que no es deseable establezca el modo de fetch (que por lo general el uso Inscribase ya IIRC FetchMode.EAGER está desfasada) debe resolver el problema:

baz = persistenceManager.createCriteria(Car.class, "myCarAlias")
    .setFetchMode("drivers", FetchMode.JOIN)
    // add additional restrictions here
    .list();

Otros consejos

sección

15.5 de la documentación de hibernación. Básicamente se puede establecer la estrategia de recuperación para sus consultas de criterios, que debe tener prioridad sobre la estrategia de recuperación básica que ha definido para la relación.

el ejemplo de la documentación

List cats = sess.createCriteria(Cat.class)
   .add( Restrictions.like("name", "Fritz%") )
   .setFetchMode("mate", FetchMode.EAGER)
   .setFetchMode("kittens", FetchMode.EAGER)
   .list();

y la documentación http://docs.jboss.org/hibernate/core /3.3/reference/en/html/querycriteria.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top