我有一个可以自己组成的实体:
class Group {
// ...
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(
name = "group_group",
joinColumns = @JoinColumn(name = "id"),
inverseJoinColumns = @JoinColumn(name = "parentgroup_id")
)
@OrderColumn
private List<Group> groups = new ArrayList<Group>();
@ManyToOne
private Group parentGroup;
public List<Group> getGroups() {
return groups;
}
public Group getGroup() {
return parentGroup;
}
}
我可以创建一个组并添加两个子组:
Group parent = new Group();
Group child1 = new Group();
Group child2 = new Group();
parent.getGroups().add(child1);
parent.getGroups().add(child2);
parent = groupRepository.save(parent);
// parent.getGroups().get(0).getId() == child1.getId()
// parent.getGroups().get(1).getId() == child2.getId()
但这似乎是巧合。我能够更新订单(例如使用Collections.sort)并且连接表行正确更新。
如何加载父组并不重要,子组始终按创建顺序排列。执行的SQL查询是:
SELECT t1.ID, t1.PARENTGROUP_ID FROM GROUP t0, GROUP t1 WHERE ((t1.PARENTGROUP_ID = ?) AND (t0.ID = t1.PARENTGROUP_ID))
没有ORDER BY似乎错了。我如何说服EclipseLink添加它?
答案 0 :(得分:1)
问题是我尝试使用CrudRepository加载子组实体。存储库忽略@OrderColumn
注释。我通过获取父组并使用getGroups()
来修复它。
答案 1 :(得分:0)
尝试使用不依赖于数据库的@OrderBy
。您需要提供从Group
订购的字段(注意字段而不是列)。
@OrderBy("fieldNameGoesHere DESC")
private List<Group> groups = new ArrayList<Group>();
OrderColumn
将维护数据库中列表的顺序,这会带来额外的性能和维护开销。 OrderBy
将持久性提供程序的责任放在维护实体的顺序上,但是顺序不会在持久性上下文中持续存在。
有关详细信息,请查看我创建的有关@OrderBy的blog post。