【问题标题】:Ordering associated collection with fetch join in Hibernate在 Hibernate 中使用 fetch join 对关联集合进行排序
【发布时间】: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


【解决方案1】:

感谢 JB Nizet 的评论,解决方案变得如此简单。我应该使用 List 而不是 Set。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 2021-11-26
    • 2012-01-21
    • 2022-11-12
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多