一尘不染

Hibernate OneToMany条件返回重复项

hibernate

我有一个由以下映射的关联:

@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 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。


阅读 234

收藏
2020-06-20

共1个答案

一尘不染

您需要添加distinct,例如

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

应该适合您的情况

2020-06-20