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;
    }
}

グループを作成し、2 つの子グループを追加できます。

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データベースに依存しないを使用してみてください。注文するフィールドを指定する必要があります(列ではなくフィールドGroupに注意してください)。

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

OrderColumnデータベース内のリストの順序が維持されるため、パフォーマンスとメンテナンスのオーバーヘッドが追加されます。 OrderBy永続化プロバイダにエンティティの順序を維持する責任を負わせますが、順序は永続化コンテキスト間で保持されません。

詳細については、@OrderBy に関して作成したこのブログ投稿を確認してください。

于 2013-05-06T09:28:05.130 に答える