Prevent Hibernate N + 1 Выбирает при группировании по объекту - PullRequest
2 голосов
/ 02 декабря 2010

У меня есть объект Hibernate Criteria, который я строю таким образом:

Criteria obsCriteria = hibernateTemplate.getSessionFactory()
  .getCurrentSession().createCriteria(Observation.class);

ProjectionList projection = Projections.projectionList()
  .add(Projections.rowCount())
  .add(Projections.avg("value").as("avgScore"))
  .add(Projections.avg("type.score"))
  .add(Projections.max("date"))
  .add(Projections.groupProperty("observedSubject"));
criteria.setProjection(projection);

Это дает правильный результат для меня, но свойство "seenSubject" является сущностью. Когда я установил для show_sql значение true, я увидел, что после первого запроса (который возвратил 18 строк) было 18 вариантов выбора для получения сущностей наблюдаемых объектов. Я пробовал:

criteria.setFetchMode("observedSubject", FetchMode.JOIN);

Но это не сработало. Как удар в темноте я попытался:

criteria.createAlias("observedSubject", "observedSubject", Criteria.FULL_JOIN);

Но это тоже не сработало. Есть ли способ предотвратить такое поведение?

1 Ответ

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

Аннотировали ли вы от observedSubject до FetchType.LAZY?Если нет, Hibernate возвращается к поведению по умолчанию, которое EAGER извлекается.

Если вы делаете хотите, чтобы дочерняя ассоциация извлекалась во время выполнения, но вы не хотите отдельного SELECTвызовов для каждой ассоциации, установите @BatchSize для ассоциации, и Hibernate будет пакетировать вызовы SELECT, делая вещи более эффективными.

...