hibernate: как отобразить ассоциацию Set, чтобы сохранить порядок HQL по - PullRequest
1 голос
/ 13 сентября 2011

ОК, это выглядит как (еще одна) ошибка / не реализованная функциональность в Hibernate.

Можно ли отобразить ассоциацию Set таким образом, чтобы соблюдалось условие "order by" в HQL?

Например, скажем, у вас есть 2 сущности: PageEntity и QuestionEntity.На странице есть набор.

Как заставить работать следующий HQL:

from
    PageEntity p
        left outer join fetch p.questionEntities q
order by
    q.orderIndex

Чего я не хочу:

  • для использования сортировки в Java (у нас есть «order by» в SQL, поэтому нам не нужно этого делать!).SortedSet, Comparators и т. Д. Исключены
  • , чтобы отобразить его как список с <list-index>.Это добавит "order by" ко всем запросам SQL, и я не хочу, чтобы
  • использовал <set order-by="orderIndex">, потому что, опять же, это будет применяться ко всем запросам

Отладка, я вижу, что используемая реализация Set - это org.hibernate.collection.PersistentSet, которая включает Set.Реализация обёрнутого Set составляет HashSet.Я ожидаю, что Hibernate будет достаточно умен, чтобы использовать вместо него LinkedHashSet, чтобы он мог выполнить мое предложение "order by" HQL.

Ответы [ 3 ]

2 голосов
/ 13 сентября 2011

Я почти уверен, что Hibernate не может сделать это для вас, и рекомендовал бы вместо этого использовать List.Чтобы удалить дубликаты, представленные объединением, вы можете использовать ключевое слово distinct.Получившийся List будет так же хорош, как и любой Set.

Если они вам все еще нужны в упорядоченном Set (возможно, задействован сторонний API), вы можете создать свой собственный LinkedHashSetи переместите туда все объекты:

List<PageEntity> list = runQuery(...);
return new LinkedHashSet<PageEntity>(list);
0 голосов
/ 13 сентября 2011

order by относится к результатам запроса.Не для субъектов в сборнике вопросов.Я не думаю, что это ошибка: что будет делать, если одна из возвращенных сущностей страниц уже загружена в сеансе, используя другой запрос с другим предложением order by?, выберите вопросы:

select q from QuestionEntity q inner join fetch q.page p order by q.orderIndex

или

select p, q from PageEntity p
left outer join fetch p.questionEntities q 
order by q.orderIndex

должны сделать свое дело.

0 голосов
/ 13 сентября 2011

Кажется, вы хотите получить результаты, отсортированные по q.orderIndex, но

  • хотите ли вы, чтобы результирующий список PageEntity был отсортирован?
  • или (как мне кажется) Вы хотите, чтобы набор QuestionEntity s для каждого PageEntity был отсортирован?

Если вы хотите последнее: Set s в Java делают не сохраняют порядок.

После редактирования: Hibernate не обязательно должен быть smart : если вы определите свою коллекцию как Set, она будет рассматриваться как набор.Есть много приложений, где сохранение заказа стоит ресурсов и не нужно.

...