質問
オブジェクトのリストがあり、リスト内のすべてのオブジェクトには、明示的に変更しない限り、変更できない、つまりオブジェクトがキュー内にある位置があります。これらのオブジェクトを保存するためにエンティティクラスで使用するコレクションと、そのコレクションに注釈を付ける方法を教えてください
現在これを持っています
@Entity
class Foo {
...
@OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
List<Bar> bars = new ArrayList<Bar>();
...
}
JPAだけではこれが不可能な場合は、JPAプロバイダーとしてEclipseLinkを使用しているので、EclipseLink固有のアノテーションは他に何も役に立たなくても大丈夫です。
編集:人々に注意してください、問題はJavaが順序を保存しないことではなく、ほとんどのコレクションが順序を保存することを知っています。問題はJPAが順序を保存する賢い方法を知らないことです。注文IDを取得し、それによってクエリを注文することは可能ですが、私の場合、注文IDを維持するのは面倒です(ユーザーインターフェイスによりアイテムの並べ替えができるため)、よりスマートな方法を探しています。
解決
これをSQLへのラウンドトリップ後に順序付けする場合は、エンティティ自体内で何らかの順序付けIDを提供する必要があります。SQLはリスト指向ではなくセット指向です。その後、それらを取得してからソートするか、クエリで順序が指定されていることを確認します。
エンティティに自動生成された整数IDを与えると、この可能性がありますが動作しますが、保証したくありません。
他のヒント
Jonが提案したように、ソート順序IDを使用し、@ OneToManyの下に@OrderByアノテーションを追加します。これにより、指定したフィールドでクエリが並べ替えられます。
例として、&quot; sortId&quot;という新しいフィールドを追加すると、バーの場合、Fooは次のようになります。
@Entity
class Foo {
...
@OneToMany(mappedBy = "foo", cascade = CascadeType.ALL)
@OrderBy("sortId ASC")
List bars = new ArrayList();
...
}
次のことができます
- 作成前にリストをソート
- 作成後にリストを並べ替える
- 挿入時にソートを実行するコレクションを使用します。 TreeMap、TreeSet
リンクリストは、Javaのキューインターフェースを実装し、中間に物事を追加できるようにします...
TBHほとんどのコレクションは注文されています...
ドキュメントを確認し、ほとんどの場合、注文されているかどうかを確認します。
ArrayListではなくLinkedListを試す価値はありますが、Jonが言ったように、注文情報を永続化する方法を見つける必要があります。
ソリューションでは、リストが必要な場合は、リストに変換するときに、各エントリに注文番号を発行して、SortedMapとして保存することが必要になる場合があります。
ただし、コレクションをLinkedListとして保存した場合、ORMはすべての変換を実行するのに十分な可能性があります。