Критерии hibernate OneToMany возвращают дубликаты - PullRequest
7 голосов
/ 08 июня 2011

У меня есть ассоциация, сопоставленная следующим образом:

@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 сущностей с атрибутом 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:

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

Кто-нибудь знает, как вернуть только уникальные родительские элементы в этом сценарии?

Советы приветствуются, стр.

1 Ответ

12 голосов
/ 08 июня 2011

Вам необходимо добавить distinct, например,

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

должно работать в вашем случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...