web-dev-qa-db-ja.com

HibernateまたはJPAアノテーションを使用して@OneToManyコレクションのサイズを制限することは可能ですか?

JPA/Hibernateアノテーションを使用してPOJOに次のマップされたコレクションがある場合:

@OneToMany(mappedBy = "columnName", fetch = FetchType.LAZY)
@OrderBy("aField")
@MapKeyJoinColumn(name = "id_fk")
@LazyCollection(value = LazyCollectionOption.EXTRA)
private Set<PojoClass> collection = new HashSet<>();

ロードされたコレクションのサイズを特定の数nに制限したり、クラスのその他のインスタンスからすべてのアイテムまたは他のアイテムをロードせずに、コレクションの最初のn要素をレイジーロードするようにページサイズを設定したりできます( @バッチサイズ)?

質問は、追加のクエリを作成するのではなく、明示的にクエリのサイズをプログラムで制限するための基準またはその他の方法を使用して、POJOマッピングに明示的に言及していることに注意してください。

私が調べてきた考えられる解決策は、Hibernate内でSQL TOPステートメントの実装を見つけることです。できればアノテーションとして、または生成されたクエリを変更するカスタムCollectionPersisterを作成します(ただし、サポートされる方言内にTOPステートメントを実装する必要があります)。

26
rodrigobartels

それは可能ではありません。 Hibernateには2つのオプションがあります。

  • 親エンティティのフェッチ時に子コレクションをロードします
  • 最初のアクセス時に子コレクションを遅延読み込みします

中間点はありません。これは、Hibernateがコレクション全体を管理する必要があるためです エンティティの状態遷移 。サブセットをロードできた場合、単方向バッグはあまり意味がありません。

@Whereまたは@Filter、これらの注釈は、コレクションのサイズを制限するのではなく、コレクションのコンテンツを除外するのに役立ちます。

したがって、常に Hibernateコレクションは機能であり、必須の要件ではない であることを覚えておく必要があります。クエリはより柔軟で制限が少なくなります。

したがって、今回はクエリを使用する必要があります。

  • HQL/JPQL
  • 基準
  • ネイティブSQL
44
Vlad Mihalcea

次のように「カスタム」結合テーブル名を使用して、エントリの量を制限できます。

@JoinTable(name = "(select * from the_table order by some_column limit 10)")
4