barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

вторник, 3 июля 2012 г.

Hibernate: fetch="subselect" и запросы с limit / order by

Столкнулся с багом Hibernate, который, похоже, живет уже давно и исправлять его не очень-то спешат: https://hibernate.onjira.com/browse/HHH-2666. Заключается он в том, что если для извлечения связанных объектов используется стратегия "subselect":

<set inverse="true" name="..." fetch="subselect">
  <key>
<column name="..." not-null="true"/>
  </key>
  <one-to-many class="..."/>
</set>
,то при извлечении родительских объектов с использованием limit / order by второй запрос, используемый для извлечения связанных объектов, в подзапросе уже не содержит limit / order by, что приводит к извлечению потенциально гораздо большего числа строк, большая часть которых может оказаться ненужной (здесь первый select выполняется hiberante`ом сразу же, второй - лениво, при обращении к коллекции связанных объектов):

Hibernate: select ... from ... where ... order by ... asc limit ?
Hibernate: select ... from ... where ... in (select ... from ... where ... )
Очень неприятно, т.к. стратегия, вобщем-то, достаточно удобная.

Комментариев нет:

Отправить комментарий