2016-05-05 12 views
3

Nehmen wir an, wir haben eine Entität mit 10 Feldern. Und nehmen wir an, dass fast alle diese Felder sehr große Datenmengen haben. Und wir wollen Entity (nicht die Menge der Felder!) Laden und zur Laufzeit definieren, welche Felder geladen werden sollen. Die Lösung, die ich gefunden habe https://stackoverflow.com/a/24710759/5057736 schlägt vor, Konstruktor zu verwenden. Aber im Fall von 10 Feldern und dass es notwendig ist, Felder zur Laufzeit zu definieren, ist keine Lösung möglich. Gibt es eine Möglichkeit, dieses Problem mit jpa 2.1 zu lösen?Hibernate - Laden von Entitäten mit zur Laufzeit definierten Feldern

+0

Nehmen wir an, Sie verwenden JPA EntityGraphs? –

+0

@Neil Stockton Ich dachte, dass EntityGraphs nur verwendet wird, um zu zeigen, welche Entitäten geladen werden, aber nicht, was ihre Felder sind. –

+0

Nein. Definiert, welche Felder geladen werden sollen. http://www.datanucleus.org/products/accessplatform_5_0/jpa/entity_graphs.html Es hat jedoch Schwächen, in dem Sie nicht explizit sagen können, laden Sie nicht Feld X –

Antwort

2

Verwenden Sie eine JPA 2.1 EntityGraph zu definieren, die Felder von der Abfrage abgerufen werden. Also, wenn Sie eine Klasse haben MyClass und wollen dynamisch bestimmte Felder abzurufen, könnte so etwas wie dies ausreichen

EntityGraph<MyClass> eg = em.createEntityGraph(MyClass.class); 
eg.addAttributeNodes("id"); 
eg.addAttributeNodes("name"); 
eg.addAttributeNodes("relation"); 

Query q = em.createQuery("SELECT b FROM MyClass b"); 
q.setHint("javax.persistence.fetchgraph", eg); 
List<MyClass> results = q.getResultList(); 
+0

Alle Felder werden jedoch standardmäßig geladen. Also, wie kann ich das Laden standardmäßig alle Felder deaktivieren? –

+0

Das ist was "fetchgraph" unterscheidet sich von "loadgraph", siehe den Link in den Kommentaren ... und sehen JPA spec Abschnitt 3.7.4 –

+0

Wenn dies der Fall ist, ist Ihr JPA-Anbieter einseitig entscheiden, dieses Feld gegen Ihre laden Wünsche (dh ich nehme nur den Fetchgraph als Empfehlung). Der JPA-Provider, den ich verwende (DataNucleus), respektiert meine Wünsche, was wirklich ein EntityGraph sein sollte. –

1

Mit einer Hibernate-Sitzung kann dies durch Verwendung eines Ergebnistransformators erreicht werden. Hibernate unterstützt die Ergebnistransformatoren für JPA nicht.

HHH-8196 Custom ResultTransformer for JPA criteria queries

Sie können unwrap(Session.class) verwenden, um ein Ergebnis Transformator, um die Sitzung zu übernehmen.

List<Person> persons = entityManager.unwrap(Session.class). 
    createQuery("select name as name from Person"). 
    setResultTransformer(
     Transformers.aliasToBean(Person.class) 
    ).list(); 

Additional information about nested projections

1

Die Fetch grafische Darstellungen sind meist zu holen Vereinigungen gezielt, nicht für einzelne Felder.

Auch wenn die JPA-Spezifikation besagt, dass Felder standardmäßig faul sein sollten, ist LAZY nur ein Hinweis für die JPA-Anbieter, die diese Option möglicherweise ignorieren. Hibernate verwendet standardmäßig kein lazy loading für Felder. Nur one-to-many and many-to-many associations are LAZY standardmäßig.

Um träge Felder zu haben, müssen Sie enable bytecode enhancement und vielleicht auch @LazyGroup verwenden.

Wie auch immer, vielleicht ein DTO projection query ist, was Sie in erster Linie benötigt.

Verwandte Themen