#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 решение оказалось таким простым. Я должен был использовать список вместо набора.