1

我有一个可以由自身组成的实体:

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 添加它?

4

2 回答 2

1

问题是我尝试使用 CrudRepository 加载子组实体。存储库忽略@OrderColumn注释。我通过获取父组并使用getGroups().

于 2013-05-08T19:08:04.940 回答
0

尝试使用@OrderBy不依赖数据库的。您需要提供一个字段 from Groupto order by(注意字段不是列)。

@OrderBy("fieldNameGoesHere DESC")
private List<Group> groups = new ArrayList<Group>();

OrderColumn将维护数据库中列表的顺序,这会带来额外的性能和维护开销。 OrderBy持久化提供者有责任维护实体的顺序,但是该顺序不会在持久化上下文中持续存在。

有关更多信息,请查看我创建的关于 @OrderBy的这篇博文。

于 2013-05-06T09:28:05.130 回答