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
Antwort
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();
Alle Felder werden jedoch standardmäßig geladen. Also, wie kann ich das Laden standardmäßig alle Felder deaktivieren? –
Das ist was "fetchgraph" unterscheidet sich von "loadgraph", siehe den Link in den Kommentaren ... und sehen JPA spec Abschnitt 3.7.4 –
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. –
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();
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.
- 1. Hibernate-Konfiguration zur Laufzeit
- 2. Hibernate-Datenbankkennwort zur Laufzeit
- 3. Laden von Jars zur Laufzeit
- 4. Verbindung zur Datenbank zur Laufzeit mit Hilfe von Spring + Hibernate
- 5. knockout.js Laden von Vorlagen zur Laufzeit
- 6. Elegante Möglichkeiten zur Handhabung von Datenbankansichten von Hibernate-Entitäten?
- 7. .Net laden Referenz zur Laufzeit
- 8. Rails - Hinzufügen von benutzerdefinierten Feldern zur Laufzeit in ActiveRecord
- 9. Linq Entitäten zur Laufzeit von benutzerdefinierten Ansicht erstellt
- 10. Hibernate Entity zu Tabelle zur Laufzeit binden
- 11. java-hibernate dynamische Tabellen zur Laufzeit erstellen
- 12. Hibernate Validator Gebietsschema zur Laufzeit ändern
- 13. Hibernate-Multi-Tenancy-Schema zur Laufzeit erstellen
- 14. Wie Hibernate-Stopp von rekursiv die Entitäten Laden
- 15. Spring Batch: Liste der definierten Jobs zur Laufzeit abrufen
- 16. Wie Hibernate Entity-Cache-Konfiguration zur Laufzeit ändern
- 17. Kann Assembly zur Laufzeit nicht laden
- 18. Laden Sie zwei Szenen zur Laufzeit
- 19. C#, ASP.NET 3.5 - Code zur Laufzeit laden
- 20. Laden Sie eine JSON-Datei zur Laufzeit
- 21. Wie bevölkert Hibernate die Entitäten
- 22. laden nicht vorhandene .xib zur Laufzeit
- 23. Laden Java-Byte-Code zur Laufzeit
- 24. Lade Winkelmodul zur Laufzeit mit/ohne ocLazyLoad
- 25. Java/Hibernate mit Schnittstellen über die Entitäten
- 26. Laden von Entitäten im Ruhezustand
- 27. Fallstricke von Sammlungen von Entitäten in Hibernate
- 28. Laden und entladen Sie verschiedene Version von jar zur Laufzeit
- 29. Laden von Entitäten in EF7
- 30. Kann ich mit dem Webpack eine Ressource zur Laufzeit laden?
Nehmen wir an, Sie verwenden JPA EntityGraphs? –
@Neil Stockton Ich dachte, dass EntityGraphs nur verwendet wird, um zu zeigen, welche Entitäten geladen werden, aber nicht, was ihre Felder sind. –
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 –