2010-10-27 10 views
8

Tengo 2 clases que tienen una relación de muchos a muchos. Tomo la 'Pregunta' y 'Etiqueta' como ejemplo para hacer que el caso sea más comprensible.Hibernar de muchos a muchos: Criterios para buscar toda la clase A que contiene la clase B

Para cada pregunta, tiene varias etiquetas. Lo mismo que para la etiqueta.

Lo que me gustaría hacer es obtener todas las preguntas (y sus etiquetas correspondientes) si la pregunta contiene una etiqueta que dice "hibernar".

Puedo, como máximo, hacerlo con SQLQuery en la tabla de muchos a muchos y devolver una lista de ID de pregunta. Luego use un criterio con una restricción.in y obtenga todas las preguntas. Pero es demasiado torpe y apuesto a que hay una mejor manera de hacerlo, ¿verdad?

Respuesta

23

Esencialmente, es necesario crear un alias y utilizar el alias para consultar la colección infantil de este modo:

List questions = sess.createCriteria(Question.class) 
    .createAlias("Tags", "t") 
    .add(Restrictions.eq("t.name", "hibernate")) 
    .list(); 

Te estoy suponiendo que en realidad no tienen una clase que representa la tabla de "puente" a la tabla de etiquetas en este escenario, de lo contrario lo que se necesita para crear, por ejemplo, 2 alias:

List questions = sess.createCriteria(Question.class) 
     .createAlias("QuestionTag", "qt")    
     .createAlias("qt.Tags", "t") 
     .add(Restrictions.eq("t.name", "hibernate")) 
     .list(); 

usted puede encontrar más información en la documentación:

http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/querycriteria.html#querycriteria-associations

+0

¡Debería haber preguntado mucho antes! No puedo creer que sea tan directo. –

+0

Gracias @lomaxx, tengo la misma pregunta pero con un pequeño requisito diferente: ¿Qué sucede si quiero comparar el "qt" con un objeto Tag? (no qt.name con tag.getName()) – smallufo

+0

@smallufo: ¿qué quieres decir? ¿Estás diciendo que tienes una etiqueta y quieres comparar la colección qt.Tags con esa etiqueta? En ese caso, debe hacer Restrictions.eq ("qt.Tags.Id", tag.Id) – lomaxx

Cuestiones relacionadas