2014-10-12 7 views
11

Wenn ich habe folgende abgebildet Sammlung in einer POJO mit JPA/Hibernate Annotations:Ist es möglich, die Größe einer @ OneToMany-Sammlung mit Hibernate- oder JPA-Anmerkungen zu begrenzen?

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

Ist es möglich, die Größe der geladenen Sammlung auf eine bestimmte Anzahl n oder zur Einstellung der Seitengröße zu faul Last zu begrenzen, die ersten n Elemente der Sammlung, ohne alle Elemente oder andere Elemente von anderen Instanzen der Klasse zu laden (wie mit @BatchSize)?

Beachten Sie, dass sich die Frage explizit auf POJO-Zuordnungen bezieht, keine zusätzlichen Abfragen durchführt, Criteria verwendet oder die Größe in expliziten Abfragen programmgesteuert begrenzt.

Mögliche Lösungen, die ich untersucht habe, sind eine Implementierung der SQL TOP - Anweisung in Hibernate, hoffentlich als Annotation oder zum Erstellen einer benutzerdefinierten CollectionPersister, um die generierte Abfrage zu ändern (obwohl dies die TOP - Anweisung innerhalb der implementiert hätte unterstützte Dialekte).

Antwort

21

Das ist nicht möglich. Hibernate hat zwei Optionen für Sie:

  • Sie die Kinder Sammlung laden
  • Sie laden die Kinder Sammlung lazily beim ersten Zugriff

Es gibt keinen Mittelweg, die Muttergesellschaft auf das Abrufen. Das liegt daran, dass Hibernate die gesamte Sammlung verwalten muss entity state transitions. Wenn Sie Subsets laden könnten, würde eine unidirektionale Tasche nicht viel Sinn machen.

Während Sie @Where oder @Filter verwenden können, sind diese Anmerkungen sinnvoller, um den Inhalt der Sammlung herauszufiltern, nicht um die Größe zu beschränken.

Also, Sie müssen immer daran denken, dass Hibernate collections are a feature, not a mandatory requirement. Abfragen sind viel flexibler und weniger einschränkend.

So haben Sie Fragen, diese Zeit zu nutzen:

  • HQL/JPQL
  • Kriterien
  • Native SQL
0

Sie konnten die Anzahl der Einträge einschränken, indem Sie einen „custom mit "Join Tabellenname wie folgt:

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