【发布时间】:2013-11-21 05:06:49
【问题描述】:
我想要一组有序的子对象(这里是 cat-kitten 示例)。并保持他们添加新元素的顺序。
@Entity
public class Cat {
@OneToMany(mappedBy = "cat", cascade = CascadeType.ALL)
@OrderBy("name ASC")
private List<Kitten> kittens;
public void setKittens(List<Kitten> kittens) { this.kittens = kittens; }
public List<Kitten> getKittens() { return kittens; }
}
当我执行cat.getKittens.add(newKitten) 时,按名称排序将被破坏。
是否可以让 hibernate 完成保持集合始终有序的工作?通过使用@Sort hibernate 注释?
@Sort 的缺点是它迫使你实现 Comparable 接口......
什么是正确的“纯JPA”方式来做到这一点?将所有内容保存到数据库并重新加载?
将@OrderBy 和@Sort 结合起来有意义吗?
更新
到目前为止的解决方案是结合@OrderBy 和@Sort。 @OrderBy 导致生成的 SQL 中的 ORDER BY 子句对性能更好(我假设 java 在插入排序容器时再次“排序”,但这应该更快,因为元素已经排序)
@Sort 与实现的Comparable 接口一起导致始终排序的容器。请注意,我现在使用 SortedSet 而不是 List。这里是更新的代码:
@Entity
public class Cat {
@OneToMany(mappedBy = "cat", cascade = CascadeType.ALL)
@OrderBy("name ASC")
@Sort(type = SortType.NATURAL)
private SortedSet<Kitten> kittens;
public void setKittens(SortedSet<Kitten> kittens) { this.kittens = kittens; }
public SortedSet<Kitten> getKittens() { return kittens; }
}
【问题讨论】:
-
自 Hibernate 4.3.0 起已弃用,请参阅:hibernate.atlassian.net/browse/HHH-8164
-
使用
@SortNatural和@SortComparator:docs.jboss.org/hibernate/orm/5.2/userguide/html_single/… -
我不认为预先排序的列表添加到 TreeSet 会更快。我期望相反,因为中序序列需要更多的树重新平衡。最好使用
@SortNatural或@OrderBy,不要同时使用。
标签: hibernate jpa collections sql-order-by sorted