我有一个由以下映射的关联:
@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; ... }
我想使用Criteria API返回所有Parent包含一个或多个Child带有attribute实体的实体的列表enabled=false。我不希望映射children集合被查询过滤。
Parent
Child
enabled=false
children
例如,给出以下内容:
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
该查询应返回以下内容:
Parent A - Child A enabled=true - Child B enabled=false Parent B - Child A enabled=false - Child B enabled=false
到目前为止,我正在使用以下条件查询:
Criteria crit = session.createCriteria(Parent.class); crit.createCriteria("children").add(Restrictions.eq("enabled", false)); List<Parent> result = crit.list(); return result;
然而,它返回的等价于
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
即,它为每个子元素返回一个父记录(填充了子集合) enabled=false
有谁知道在这种情况下如何仅返回唯一的父元素?
意见表示赞赏,p。
您需要添加distinct,例如
distinct
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
应该适合您的情况