Проблема с использованием критериев и типа извлечения - PullRequest
1 голос
/ 19 июля 2011

У меня есть две сущности: пользователь и адрес. У пользователя есть свойство address:

@OneToMany (mappedBy="user", fetch=FetchType.EAGER) 
public List<Adress> getAddress() {
    return this.address;
}
public void setAddress(List<Adress> address) {
    this.address= address;
} 

Тип извлечения нетерпелив, как показано выше.

Я пытаюсь использовать критерии для получения списка пользователей следующим образом:

List<User> p=session.createCriteria(User.class).list();

К сожалению, он получает повторных пользователей, если у пользователя более одного адреса. С активным извлечением извлечено, это не получает дубликаты. Как я могу получить список пользователей без повторяющихся элементов, используя критерии?

Ответы [ 2 ]

3 голосов
/ 19 июля 2011

Не рекомендуется отображать отношения *-ко-многим как FetchType.EAGER. Если вам нужна активная загрузка, вы делаете это для каждого отдельного запроса. Тем не менее, когда вы используете FetchType.EAGER, Hibernate переключается на выбор внешнего соединения , поскольку именно это наиболее целесообразно в ситуациях, когда действительно важна активная выборка. Внешнее соединение, конечно, вызывает поведение, которое вы видите. Я бы порекомендовал вам удалить FetchType.EAGER и написать соответствующий запрос, чтобы получить нужные данные.

Менее рекомендуемая альтернатива - добавить @Fetch(FetchMode.SELECT) к вашему отображению. Это означает, что каждый раз, когда вы загружаете пользователя, он выполняет два выбора: один для пользователя и один для адресов. По сути, это так же, как если бы вы в любом случае использовали ленивые отношения, так какой смысл?

0 голосов
/ 21 июля 2011

Set mycrit.setFetchMode("address", FetchMode.SELECT).Затем он запускает отдельный выбор для ассоциации, и вы не получите дупликов.

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