HQL присоединился к запросу, чтобы получить большое количество связей

Недавно мой проект обнаружил, что Hibernate может принимать несколько уровней отношений и получать их в одном соединении HQL для создания заполненного объекта, который нам нужен. Мы любим эту функцию, полагая, что она превзойдет ситуацию с ленивым приложением.

Проблема заключается в том, что мы сталкиваемся с ситуацией, когда у одного родителя имеется около дюжины прямых отношений, из-за чего есть несколько подзадач, и некоторые из них имеют несколько десятков строк в нескольких случаях. В результате получается довольно большой кросс-продукт, который приводит к тому, что hql вращается вокруг колес практически навсегда. Мы добрались до 11 и увидели более 100000 итераций, прежде чем мы сдались и убили.

Так ясно, хотя эта техника отлично подходит для некоторых ситуаций, она имеет ограничения, как и все в жизни. Но какова самая эффективная альтернатива в спячке для этого? Мы не хотим лениво загружать их, потому что мы столкнемся с ситуацией N + 1, которая будет еще хуже.

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

Предложения?

ОБНОВИТЬ:

Таким образом, мы получили SQL-запрос, созданный этим запросом, оказалось, что я неправильно диагностировал проблему. Кросс-продукт НЕ такой огромный. Мы выполнили тот же запрос в нашей базе данных напрямую и получили 500 строк, возвращенных всего за секунду.

Тем не менее, мы очень четко видели в журнале спящего режима, что он делал итерации 100 КБ. Возможно ли, что Hibernate может попасть в цикл в ваших отношениях или что-то еще?

Или, может быть, это нужно задать в качестве нового вопроса?

Наша команда использует специальную страtagsю для работы с ассоциациями. Коллекции ленивы, отдельные отношения тоже ленивы, кроме ссылок с простой структурой (например, ссылка на страны). И мы используем свободно-hibernate для загрузки того, что нам нужно в конкретной ситуации. Это просто из-за того, что fluent-hibernate поддерживает вложенные проекции. Вы можете обратиться к этому модульному тесту, чтобы узнать, как может быть частично загружена grid объектов. Фрагмент кода из модульного теста

List roots = H. request(Root.class).proj(Root.ROOT_NAME) .innerJoin("stationarFrom.stationar", "stationar") .proj("stationar.name", "stationarFrom.stationar.name") .eq(Root.ROOT_NAME, rootName).transform(Root.class).list(); 

Смотрите также

Как преобразовать плоский результирующий набор, используя Hibernate

  • Получить количество циклов процессора?
  • Что более эффективно i ++ или ++ i?
  • Я просто обнаружил, почему все сайты ASP.Net медленны, и я пытаюсь выяснить, что с этим делать
  • Секундомер против использования System.DateTime.Now для событий синхронизации
  • Почему смещение MYSQL выше LIMIT замедляет запрос вниз?
  • Декодирование длины пробега в MATLAB
  • Является ли стандарт C ++ низкой эффективностью для iostreams, или я просто имею дело с плохой реализацией?
  • Снижение производительности String.intern ()
  • Что происходит после промаха L2 TLB?
  • Является ли datareader быстрее, чем dataset при заполнении данных?
  • Как передавать значения на страницах ASP.net без использования сеанса
  • Давайте будем гением компьютера.