2011-07-19 25 views
12

considerar seguir dos relaciones:Hibernate: ¿Criterios con tabla de unión muchos a muchos?

@Entity class Foo { 
    @Id id; 

    @ManyToMany 
    @JoinTable(name = "ATag", 
     joinColumns = @JoinColumn(name = "foo_id"), 
     inverseJoinColumns = @JoinColumn(name = "tag_id")) 
    Set<Tag> tags; 
} 

@Entity class Tag { 
    @Id Long id; 
    String name; 
} 

no hay una clase de entidad correspondiente de la tabla de unión ATAG. Ahora, quiero obtener todas las instancias de Foo con Tag llamado 'tag1', ¿es posible usar solo Criteria?

Una sub-consulta puede ser útil, sin embargo, no puedo crear DetachedCriteria para la clase ATag.class que no existe.

Respuesta

24

Acabo de resolver este problema exacto. Estás pensando en tablas, no en objetos. Sólo referencia tags.name y dejar que Hibernate se encarga del resto:

Criteria crit = session.createCriteria(Foo.class); 
crit.createAlias("tags", "tagsAlias"); 
crit.add(Restrictions.eq("tagsAlias.name", someValue); 

Si usted mira el SQL de Hibernate escupe, verá que utiliza la tabla de unión.

+1

Es importante tener en cuenta el uso de la propiedad del objeto y no del objeto en sí. Hibernate using Restrictions no solo usa la clave primaria definida por POJO. Aquí el ejemplo usa el nombre de atributo de las etiquetas de objeto. Perdí el tiempo tratando de establecer todo el objeto en lugar de decir explícitamente qué propiedad debe verificarse bajo el predicado de criterios. –

+3

¿Por qué es necesario usar un alias? ¿No puedes simplemente usar 'tags.name' en lugar de' tagsAlias.name'? – sp00m

+0

Al crear un alias, la combinación interna se produce automáticamente. – derrik

Cuestiones relacionadas