Hibernate - как получить свойства для списка объектов в одном запросе - PullRequest
1 голос
/ 20 января 2012

У меня есть класс Persistent, относящийся ко многим коллекциям с типом выборки LAZY, например

@Entity
@Table(name = "TABLE")
public class Table implements Serializable {
    ....


    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST1", nullable = true)
    private ArrayList list1;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST2", nullable = true)
    private ArrayList list2;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST1", nullable = true)
    private ArrayList list1;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST2", nullable = true)
    private ArrayList list2;

....

}

Я создал экземпляры некоторых объектов типа TABLE через Hibernate, добавил их в список таблиц и теперь хочу получить одну из этих коллекций (скажем, list2) для всех объектов в этом списке.

for(Table table:tables){
     result=table.list2;
     ....
}

Но таким образом Hibernate сгенерирует последовательность отдельных SQL-запросов. Может ли hibernate получить список list2 для всех объектов в коллекции в одном запросе? (Важно не создавать новые экземпляры класса Table, а изменять уже существующие объекты)

Ответы [ 2 ]

1 голос
/ 20 января 2012

С справочное руководство :

Соединение «извлечение» позволяет инициализировать ассоциации или коллекции значений вместе с их родительскими объектами с помощью одного выбора.Это особенно полезно в случае коллекции.Он эффективно переопределяет внешние объединения и ленивые объявления файла сопоставления для ассоциаций и коллекций.

select t from Table t
left join fetch t.list2
where ...
0 голосов
/ 20 января 2012

Вы должны сопоставить свойство list2 с обобщениями.Допустим,

@Entity
@Table(name = "TABLE")
public class Table implements Serializable {
    ....


    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST1", nullable = true)
    private List<OtherClass> list1;

    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "LIST2", nullable = true)
    private List<OtherClass> list2;
}

HQL-запрос для этого:

select list2 from Table

Допустим, вы используете шаблон гибернации для извлечения данных:

List<OtherClass> result = getHibernateTemplate().find("select list2 from Table");
...