3 Stimmen

Kann Hibernate eine andere Sammlung von Ergebnisobjekten als eine Liste zurückgeben?

Unterstützt die Hibernate-API Objektergebnismengen in Form einer anderen Sammlung als einer Liste?

Ich habe zum Beispiel einen Prozess, der Hunderttausende von Iterationen durchläuft, um Daten für einen Kunden zu erstellen. Dieser Prozess verwendet Datensätze aus einer Wertetabelle (zum Beispiel), um diese Ausgabe für jede Iteration zu erstellen.

Bei einer Liste müsste ich die gesamte Liste durchgehen, um einen bestimmten Wert zu finden, was teuer ist. Ich würde gerne eine TreeMap zurückgeben und einen Schlüssel programmatisch angeben können, damit ich die Sammlung nach dem gewünschten Wert durchsuchen kann. Kann Hibernate dies für mich tun?

0 Stimmen

Gibt es einen Grund, warum Sie Ihre Kriterien nicht in der Where-Klausel angeben können?

0 Stimmen

Ich versuche, den gesamten Satz von Objekten, mit denen ich arbeiten möchte, in den Speicher zu ziehen, damit ich die Aufrufe an die Datenbank reduzieren kann. Wenn ich für jede Iteration ein SELECT aufrufe, habe ich es mit Hunderttausenden von Aufrufen zu tun, was entsetzlich langsam ist.

0 Stimmen

"damit ich die Zahl der Datenbankabrufe verringern kann" - das scheint nicht zu funktionieren, denn Sie haben Hunderttausende von Abrufen. Sie brauchen entweder einige intelligentere Abfragen oder eine bessere Caching-Lösung.

2voto

Guillaume Punkte 17737

Wenn ich es richtig verstehe, laden Sie eine Reihe von Daten aus der Datenbank in den Speicher und verwenden sie dann lokal, indem Sie nach bestimmten Objekten in dieser Liste suchen.

Wenn dies der Fall ist, sehe ich 2 Möglichkeiten.

  1. Laden Sie nicht alle Daten, sondern greifen Sie bei jeder Iteration mit einer Abfrage auf die Datenbank zu, die nur den spezifischen Datensatz zurückgibt, den Sie benötigen. Dies führt zu mehr Datenbankabfragen und ist daher wahrscheinlich langsamer, verbraucht aber viel weniger Speicher. Diese Lösung könnte leicht verbessert werden, indem man einen Cache hinzufügt, so dass die am häufigsten verwendeten Werte schnell abgerufen werden können. Natürlich ist eine Leistungsmessung erforderlich, aber ich bevorzuge in der Regel eine naive Lösung mit gutem Caching, da der Cache als Querverbindung implementiert werden kann und für den Programmierer sehr transparent ist.
  2. Wenn Sie wirklich alle Ihre Daten in den Speicher laden wollen (was eigentlich eine Form der Zwischenspeicherung ist), wird die Zeit für die Umwandlung Ihrer Daten von einer Liste in eine TreeMap (oder eine andere effiziente Struktur) im Vergleich zur vollständigen Verarbeitung wahrscheinlich gering sein. Sie könnten also die Datenumwandlung selbst vornehmen.

Wie ich schon sagte, würde ich im allgemeinen Fall eine Lösung mit Caching bevorzugen ...

0 Stimmen

Lösung 1 ist genau die Art und Weise, wie ich meinen Code im Moment eingestellt habe. Die Anzahl der Abfragen an die Datenbank verlangsamt die Ausführungszeit auf ein inakzeptables Niveau (dieser Code wird für jeden Bezirk in den USA ausgeführt... 3141 Mal potenziell Hunderttausende von Iterationen).

0 Stimmen

Vielleicht ist meine Zwischenspeicherlösung falsch eingerichtet, denn selbst wenn ich die Zwischenspeicherung eingerichtet habe, sehe ich immer noch Abfragen, die mit SQL Profiler (SQL Server-Datenbank) ausgeführt werden.

2voto

erickson Punkte 256579

Ich nehme an, Sie beziehen sich auf die [Query.list()](http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Query.html#list()) Methode. Wenn ja: Nein, es gibt keine andere Möglichkeit, Ergebnisse der obersten Ebene zurückzugeben als eine List . Wenn Sie zu viele Ergebnisse erhalten, warum stellen Sie dann nicht eine eingeschränktere Abfrage an die Datenbank? Wenn die Abfrage schwer einzuschränken ist, können Sie Ihre eigene Map mit dem Inhalt von Hibernate's List und dann die Liste wegwerfen.

0 Stimmen

Danke, erickson. Das ist die Antwort, die ich brauchte.

1voto

Elie Punkte 13413

Von Java-Persistenz mit Hibernate :

  • Eine java.util.Map kann gemappt werden mit <map> unter Beibehaltung von Schlüssel- und Wertpaaren Paare. Verwenden Sie eine java.util.HashMap auf eine Eigenschaft zu initialisieren.
  • A java.util.SortedMap kann abgebildet werden mit <map> Element, und das sort Attribut kann entweder auf einen Komparator oder natürliche Ordnung für speicherinterne Sortierung. Initialisieren Sie das Sammlung mit einer java.util.TreeMap Instanz.

0 Stimmen

Nebenbei bemerkt, können Sie List/SortedList, Set/SortedSet, Map/SortedMap, Collection/Bag und primitive-array für die Gruppierung von Objekten mit Hibernate verwenden.

1voto

Michael Borgwardt Punkte 334642

Ja, das kann man machen.

Wahrscheinlich müssen Sie jedoch Ihre Domänenklasse so einrichten, dass sie Comparable Ich glaube nicht, dass man das mit einem Comparator machen kann.

Editar: Es scheint, als hätte ich die Frage falsch verstanden. Wenn Sie über das Ergebnis einer Ad-hoc-Abfrage sprechen, dann wird Ihnen das oben genannte nicht helfen. Es könnte möglich sein, dass es funktioniert, indem man ein Objekt mit einer TreeMap-Eigenschaft an eine Datenbankansicht bindet, wenn die Abfrage festgelegt ist.

Natürlich können Sie die Karte auch selbst erstellen, was nur wenig Arbeit und Aufwand bedeutet.

0 Stimmen

Interessant ... bedeutet dies, dass ich eine Wrapper-Klasse für das Objekt schreiben müsste, das meine Tabelle darstellt? Zum Beispiel eine ValueMap, die eine Karte von Value-Objekten enthält? Oder hat Hibernate eine spezielle Methode anstelle von list(), um die Ergebnisse zurückzugeben?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X