¿Cómo uso hibernate para consultar una lista de alguna entidad basada en su propiedad de muchos a muchos sin filtrar elementos en la propiedad de muchos a muchos?

Tengo una clase de entidad Foo que tiene una relación de muchos a muchos con Bar

...
<class name="Foo">
    ...
    <set name="bars" table="FooBar" lazy="true" batch-size="100" fetch="select">
        <key column="FooID" />
        <many-to-many column="BarID" class="Bar" />
    </set>
    ...
</class>
...

Estoy tratando de crear una pantalla de búsqueda que permita a los usuarios buscar todos Foos que se adjuntan a un específico Bar. Todos Barestá unido a cada Foo debe mostrarse en el resultado de la búsqueda.

Entonces probé este código:

criteria.createAlias("bars", "bar", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.eq("bar.id", barID));

Esto filtra la Foo graba muy bien. Pero también filtra la bars propiedad. Así que agregué esta línea:

criteria.setFetchMode("bars", FetchMode.SELECT)

Pero eso no hizo nada.

No tengo ningún filtro de hibernación en Bar en la sesión de hibernación. ¿Alguien puede ayudarme?

preguntado el 18 de septiembre de 12 a las 17:09

2 Respuestas

cuando tiene filtros en los elementos de la colección, la colección no se inicializa y luego se recupera de forma perezosa al acceder. Tal vez Hibernate no pueda hacer coincidir bar y barId. Tratar

criteria.createAlias("bars", "bar", CriteriaSpecification.LEFT_JOIN);
criteria.add(Restrictions.eq("bar.id", barID));

Respondido el 19 de Septiembre de 12 a las 12:09

Tom, ya que quieres volver Fooestá unido a un específico Bar, no necesita usar una combinación izquierda. Puede usar una combinación interna y luego el BarLos correos electrónicos se obtendrán a través de N+1 selecciones (1 selección para obtener el filtrado Foos, y luego una selección por Foo volvió a conseguir su Bars).

Tengo un código muy similar al tuyo arriba, y noté que la combinación izquierda forzaría el Bars se cargará desde el conjunto de resultados inicial, mientras que una unión interna usaría N+1 selecciones. También intenté especificar el modo de búsqueda sin ningún efecto. En mi caso, no puedo usar una combinación interna porque uso filtros que requieren una combinación izquierda. Por ejemplo:

criteria.add(Restrictions.not(Restrictions.ilike("bar.name", "FizzBuzz")));

En ese caso, un Foo sin Bardebe ser devuelto porque no tiene Bar cuyo nombre es "FizzBuzz", pero usar una combinación interna eliminaría todos Foo sin Bars. Si alguien más pudiera proporcionar una respuesta alternativa a la pregunta de Tom que todavía usa una combinación izquierda, ¡se lo agradecería mucho!

Editar: encontré un informe de error de Hibernate que establece que "criteria.setFetchMode se ignora si lo combina con createCriteria para agregar una restricción":

https://hibernate.onjira.com/browse/HHH-3524

Respondido 10 Oct 12, 23:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.