Упорядочивание связанной коллекции с помощью объединения выборки в режиме гибернации

#hibernate #sql-order-by #hql #left-join

#переход в режим гибернации #sql-order-by #hql #левое соединение

Вопрос:

У меня есть таблица категорий. Каждая категория может иметь подкатегории. Я хочу получить все категории из базы данных, а также с нетерпением инициализировать коллекции подкатегорий. Я хочу, чтобы все они были отсортированы по свойству name.

Использование Comparator работает хорошо, и все подкатегории отсортированы в правильном порядке.

 @OneToMany(mappedBy="parentCategory")
@Sort(type = SortType.COMPARATOR, comparator = InboxCategoryComparator.class)
private SortedSet<InboxCategory> childCategories;

[....]

Criteria criteria = openSession()
    .createCriteria(InboxCategory.class);

criteria
    .setFetchMode( "childCategories", FetchMode.JOIN )
    .setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY ); 
 

Но почему использование предложения ORDER BY не работает, а подкатегории расположены в случайном порядке?

 @OneToMany(mappedBy="parentCategory")
private Set<InboxCategory> childCategories;

[....]

Query q = openSession().createQuery(
    "from InboxCategory category "  
    "left join fetch category.childCategories child "  
    "order by category.name desc, child.name desc");

q.setResultTransformer( new DistinctRootEntityResultTransformer() );
 

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

1. Поскольку набор не поддерживает никакого порядка в своих элементах.

2. В этом случае есть ли какая-либо возможность отсортировать связанную коллекцию с помощью предложения ORDER BY? Что-то вроде объединения SortedSet и предложения ORDER BY? Я пытался это сделать, но удаление аннотации @Sort генерирует исключение…

3. Я бы начал с использования коллекции, которая поддерживает порядок своих элементов: списка.

4. Спасибо! Решением проблемы была замена Набора Списком.

Ответ №1:

Благодаря комментарию JB Nizet решение оказалось таким простым. Я должен был использовать список вместо набора.