首先:我假设您正在谈论两个实体之间的关系。就像是
@Entity
public class A {
@ManyToMany
@JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_fk") }, inverseJoinColumns = { @JoinColumn(name = "B_fk") })
private Set<B> bSet = new LinkedHashSet<B>();
}
Hibernate 本身不会保留顺序!
如果您查看A
从数据库加载实体时使用的类,那么它Set
bSet
是 type PersistentSet
,它是另一个 的包装器Set
,这(在我的情况下)是一个 normal HashSet
。(HashSet
不保留其元素的顺序。)
即使 Hibernate 使用List
or LinkedHashSet
,仍然不建议将实现基于自然(不保证)数据库顺序。对于 MySQL,它是某种反模式。
但是您可以使用@Sort
注释 ( org.hibernate.annotations.Sort
) 来明确排序。例如:
@OneToMany(mappedBy = "as")
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class);
public SortedSet<C> cs;
@see:在 JPA 查询中排序返回子对象
由 Łukasz Rzeszotarski 于 2012 年 9 月 1 日添加:
但是我们必须记住,使用@Sort
注解会导致在内存(jvm)中而不是在 sql 中对对象进行排序。相反,我们可以使用@OrderBy
导致在 sql server 端排序的注释。在我 (Łukasz Rzeszotarski ) 看来,这两个注释都有一个弱点,即默认设置排序。我(Łukasz Rzeszotarski)宁愿休眠时使用自己的 LinkedHashSet 实现,当它“看到”使用 order by 子句时。
@see: sql 中的休眠排序