2010-12-17 3 views
2

Меня спросили в интервью сегодня о загруженности Hibernate. Вопрос был: Если есть класс Employee и класс адреса и отношения: 1 сотрудник -> много адресов. Как с помощью одного запроса можно запросить класс Employee и получить все адреса?Критерии Hibernate API

Я упомянул, что мы можем активировать загрузку по адресу ... но это приведет к N + 1 sqls.

Требование состоит в том, чтобы загрузить всех сотрудников и адресов с использованием 1 sql. Ответ, предположительно, связан с API-интерфейсом Hibernate. Когда я смотрю в сети, я не уверен, как это можно достичь. Любые мысли были бы оценены.

ответ

3

От hibernate reference:

List cats = sess.createCriteria(Cat.class) 
    .add(Restrictions.like("name", "Fritz%")) 
    .setFetchMode("mate", FetchMode.EAGER) 
    .setFetchMode("kittens", FetchMode.EAGER) 
    .list(); 

в этом будет получить список кошек с именем, как Fritz%, а у их исходный мате уже загружен и их коллекция котят также уже загружены.

Возможно, экспериментируйте с чем-то подобным, чтобы проверить созданный sql, чтобы увидеть, что он выполняет внешнее соединение с ссылками, с выборкой, более установленной в Eager.

+0

Действительно ли это работает иначе, чем просто использование `@Fetch (FetchType.EAGER)`? Любая идея почему? – 2010-12-17 14:55:40