【发布时间】:2014-06-22 12:52:46
【问题描述】:
我有一个类别表。每个类别都可以有子类别。我想从数据库中获取所有类别,并急切地初始化子类别集合。我希望它们都按名称属性排序。
使用 Comparator 效果很好,所有子类别都按 id 良好的顺序排序。
@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() );
【问题讨论】:
-
因为 Set 不维护其元素中的任何顺序。
-
在这种情况下,是否有可能使用 ORDER BY 子句对相关集合进行排序?像结合 SortedSet 和 ORDER BY 子句之类的东西?我试图这样做,但删除 @Sort 注释会产生异常......
-
我会先使用一个保持其元素顺序的集合:一个列表。
-
谢谢!用列表替换 Set 是解决方案。
标签: hibernate sql-order-by hql left-join