2011-06-08 14 views
7

He una asociación asignada por el siguiente texto:hibernar OneToMany criterios vuelve duplicados

@Entity 
public class Parent 
{ 
... 
    @Id 
    @Column(name = "parent_id") 
    private Long id; 

    @OneToMany(mappedBy = "parent") 
    @OrderBy("id") 
    private List<Child> children; 
... 
} 

@Entity 
public class Child 
{ 
... 
    @Id 
    @Column(name = "child_id") 
    private Long id; 

    @ManyToOne 
    @NotFound(action = NotFoundAction.IGNORE) 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 

    @Column 
    private Boolean enabled; 
... 
} 

me gustaría utilizar la API Criterios para devolver una lista de todos los Parent entidades que contienen uno o más Child entidades con el atributo enabled=false. No me gustaría que la colección mapeada children sea filtrada por la consulta.

Por ejemplo, dada la siguiente:

Parent A 
    - Child A enabled=true 
    - Child B enabled=false 

Parent B 
    - Child A enabled=false 
    - Child B enabled=false 

Parent C 
    - Child A enabled=true 
    - Child B enabled=true 

la consulta debe devolver el siguiente:

Parent A 
    - Child A enabled=true 
    - Child B enabled=false 

Parent B 
    - Child A enabled=false 
    - Child B enabled=false 

Hasta el momento estoy usando los siguientes criterios de búsqueda:

Criteria crit = session.createCriteria(Parent.class); 
crit.createCriteria("children").add(Restrictions.eq("enabled", false)); 
List<Parent> result = crit.list(); 
return result; 

Sin embargo está devolviendo el equivalente de

Parent A 
    - Child A enabled=true 
    - Child B enabled=false 

Parent B 
    - Child A enabled=false 
    - Child B enabled=false 

Parent B 
    - Child A enabled=false 
    - Child B enabled=false 

Es decir, se está volviendo un único registro padre (con la colección de los niños poblada) para cada elemento secundario con enabled=false

¿Alguien sabe cómo sólo para regresar elementos primarios únicos en este escenario?

Asesoramiento apreciado, p.

Respuesta

12

Debe agregar un distinct, p. Ej.

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

debe trabajar en su caso