Hibernate - sqlQuery ordnen redundante Datensätze zu, während Sie JOIN in OneToMany verwenden

8

Ich habe eine @ OneToMany-Verknüpfung zwischen zwei Entitäten ( Entity1 To Entity2 ).

Mein sqlQueryString besteht aus den nächsten Schritten:

  • select ent1.*, ent2.differ_field from Entity1 as ent1 left outer join Entity2 as ent2 on ent1.item_id = ent2.item_id
  • Hinzufügen von Unterabfragen und Schreiben von Ergebnissen in some_field2, some_field3 etc.


Ausführen:

%Vor%

und

%Vor%

Das Ergebnis ist also List<SomeDto>

Felder, die grau markiert sind, sind gleich.

  

Also was ich will, ist group by , zum Beispiel item_id und   Das List<Object> differFieldList wäre als Aggregationsergebnis.

%Vor%

oder so etwas Map<SomeDto, List<Object>>

  

Ich kann es manuell abbilden, aber es gibt ein Problem:   Wenn ich sqlQuery.setFirstResult(offset).setMaxResults(limit) verwende   Ich erhalte limit Anzahl der Datensätze. Aber es gibt redundante Zeilen. Nach der Zusammenführung habe ich eigentlich weniger zählen.

Vielen Dank im Voraus!

    
InsFi 12.08.2015, 21:55
quelle

2 Antworten

2

Wenn Sie die Abfrageergebnisse in einer Sammlung dieser Klasse speichern möchten:

%Vor%

Wenn sqlQuery.setFirstResult (offset) .setMaxResults (n) verwendet wird, basiert die Anzahl der zu begrenzenden Datensätze auf der verbundenen Ergebnismenge. Nach dem Zusammenführen könnte die Anzahl der Datensätze geringer sein als erwartet, und die Daten in der Liste könnten auch unvollständig sein.

Um den erwarteten Datensatz zu erhalten, muss die Abfrage in zwei Teile aufgeteilt werden.

In der ersten Abfrage wählen Sie einfach Daten aus Entity1

aus %Vor%

Query.setFirstResult (offset) .setMaxResults (n) kann hier verwendet werden, um die Datensätze einzuschränken, die Sie zurückgeben möchten. Wenn Felder von Entität2 als Bedingung in dieser Abfrage verwendet werden müssen, können Sie die vorhandene Unterabfrage verwenden, um sich mit Entity2 zu verbinden und nach Entity2-Feldern zu filtern.

Sobald Daten von der Abfrage zurückgegeben wurden, können Sie item_id extrahieren und sie in eine Auflistung einfügen und die Sammlung zum Abfragen von Entität 2 verwenden:

%Vor%

Query.setParameterList () kann verwendet werden, um die Element-ID-Auflistung festzulegen, die von der ersten Abfrage an die zweite Abfrage zurückgegeben wird. Dann müssen Sie die von Abfrage 2 zurückgegebenen Daten manuell den Daten zuordnen, die von Abfrage 1 zurückgegeben wurden.

Das scheint ausführlich zu sein. Wenn das JPA @ OneToMany-Mapping zwischen den beiden Entitätsobjekten konfiguriert ist und Ihre Abfrage in HQL geschrieben werden kann (Sie haben das im Kommentar nicht angegeben), können Sie Hibernate automatisch die Entity2-Sammlung für Sie automatisch laden lassen. In diesem Fall kann der Code sehr viel sein sauberer, aber hinter den Kulissen kann Hibernate mehr Anfrageanforderungen an die DB erzeugen, während die Entität, die auf der Seite Viele sitzt, langsam geladen wird.

    
JM Yang 13.09.2015, 02:32
quelle
1

Die duplizierten Datensätze sind aus relationaler Datenbankperspektive natürlich. Um die Projektion nach objektorientierten Prinzipien zu gruppieren, können Sie ein Hilfsprogramm wie dieses verwenden :

%Vor%

Der Code ist auf GitHub verfügbar.

    
Vlad Mihalcea 11.09.2015 11:29
quelle

Tags und Links