2014-10-12 14 views
11

Se ho la seguente raccolta mappato in un POJO utilizzando JPA/Hibernate NOTE:È possibile limitare la dimensione di una raccolta @OneToMany con Hibernate o Annotazioni JPA?

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

E 'possibile limitare la dimensione della collezione caricato a un numero specifico n o per impostare le dimensioni della pagina a carico pigro i primi n elementi della raccolta senza caricare tutti gli elementi o altri elementi da altre istanze della classe (come con @BatchSize)?

Si noti che la domanda fa esplicitamente riferimento ai mapping POJO, non effettua query aggiuntive, utilizza criteri o qualsiasi altro modo per limitare a livello di codice le dimensioni nelle query esplicite.

possibili soluzioni che ho Guardando stanno trovando un'implementazione dell'istruzione SQL TOP all'interno di Hibernate, si spera come annotazione o creare un CollectionPersister personalizzato per modificare la query generato (anche se ciò richiederebbe avere la dichiarazione TOP attuata nel dialetti supportati).

risposta

21

Questo non è possibile. Hibernate ha due opzioni per voi:

  • si carica la collezione bambini sul recupero della controllante
  • si carica la collezione bambini pigramente al primo accesso

Non c'è via di mezzo. Questo perché Hibernate deve gestire l'intera collezione entity state transitions. Se tu potessi caricare sottoinsiemi allora un sacchetto unidirezionale non avrebbe molto senso.

Mentre è possibile utilizzare @Where o @Filter, queste annotazioni sono più utili per filtrare il contenuto della raccolta, non per limitare le sue dimensioni.

Quindi, è sempre necessario ricordare che Hibernate collections are a feature, not a mandatory requirement. Le domande sono molto più flessibili e meno limitanti.

Quindi, è necessario utilizzare le query questa volta:

  • HQL/JPQL
  • Criteri
  • SQL Native
0

Si potrebbe limitare la quantità di voci utilizzando un "su misura "unire il nome della tabella in questo modo:

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