首先:我假设你说的是两个实体之间的关系。类似的东西
@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>();
}
休眠本身并不能保持顺序!
如果您看一下从数据库加载实体时使用的类,那么 is 类型为 ,它是围绕另一个的包装器,这(在我的情况下)是正常的。( 不保留其元素的顺序。A
Set
bSet
PersistentSet
Set
HashSet
HashSet
即使使用了 Hibernate 或 ,仍然不建议将实现基于自然(不保证)数据库顺序。对于MySQL来说,它是某种反模式。List
LinkedHashSet
但是,您可以使用批注 () 来显式排序。例如:@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服务器端排序的注释。这两个注释在我(Łukasz Rzeszotarski)看来都有一个弱点,即默认设置排序。我(Łukasz Rzeszotarski)宁愿冬眠使用自己的LinkedHashSet实现,当它“看到”使用按子句排序时。
@see:sql 中的休眠排序