Набор вопросов по Hibernate Quering - PullRequest
1 голос
/ 17 февраля 2012

Пожалуйста, помогите мне с этими проблемами Hibernate.

Рассмотрите следующую структуру:

@Entity
class Manager {
    @OneToMany
    List<Project> projects;
}

0) Есть два возможных способа динамического извлечения в HQL:

  • выберите m из диспетчера m присоединитесь к m.projects
  • из диспетчера m получите выборку m.projects

В моемВторой параметр setup всегда возвращает результат декартового произведения с неправильным числом объектов в списке, а первый всегда возвращает правильное количество объектов в списке.Но SQL-запросы выглядят одинаково.Означает ли это, что предложение «select» удаляет избыточные объекты из списка в памяти?В этом случае странно видеть совет в книге, чтобы использовать select selected ... , чтобы избавиться от избыточных сущностей, в то время как «select» выполняет свою работу.Если это неверное предположение, чем почему эти 2 запроса возвращают разные результаты?

  1. Если я использую динамическую выборку одним из 2 методов, описанных выше, я вижу классический вывод проблемы выбора n + 1 вмой журнал SQL в спящем режиме.Действительно, аннотации FetchMode (подвыбор или объединение) не имеют мощности при динамическом извлечении.Неужели я не могу решить проблему n + 1 в этом конкретном случае?

  2. Похоже, Hibernate Criteria API не поддерживает универсальные шаблоны.Я прав?Похоже, я должен использовать JPA Criteria API вместо этого?

  3. Можно ли написать HQL-запрос с параметром имени объекта внутри?Например, «from: myEntityParam p, где p.id = 1» и после этого вызвать setParameter («myEntityParam», MyClass.class).На самом деле мне нужен общий HQL-запрос для замены нескольких неуниверсальных дао на один общий.

1 Ответ

3 голосов
/ 17 февраля 2012

0) Я всегда использую предложение select, потому что оно позволяет указать, что вы хотите выбрать, и в любом случае является обязательным в JPQL. Если вы хотите выбрать менеджеров с их проектами, используйте

select distinct m from Manager m left join fetch m.projects

Если не использовать отдельное ключевое слово, список будет содержать n экземпляров каждого менеджера (n - количество проектов менеджера): Hibernate возвращает столько элементов, сколько строк в наборе результатов. *

1) Если вы хотите избежать проблемы n + 1, выберите другую ассоциацию в том же запросе:

select distinct m from Manager m 
left join fetch m.projects 
left join fetch m.boss

Вы также можете настроить пакетную загрузку для загрузки 10 боссов (например) в тот момент, когда к первому боссу обращаются. Ищите «пакетная загрузка» в справочном документе.

2) Весь API Hibernate не генерируется. Это было сделано на JDK 1.4, до дженериков. Это не значит, что это бесполезно.

3) Нет. Параметры HQL-запроса, в конце концов, являются подготовленными параметрами оператора. Для этого вы должны использовать конкатенацию строк.

...