Hallo zusammen,
bin ein Anfänger in Sachen Hibernate und habe zwei Probleme, die ich möglichst schnell lösen muss:
1. Beschreibung:
Bei der Auflösung eines "komplexeres" Statements ignoriert Hibernate die vorgegebene Fetching-Strategie "join".
Abstraktes Beispiel:
select a.*, b.*, c.*,d.* from a inner join b on a.FKb= b.PKb
inner join a.FKc = c.PKc
left outer join c.FKd = d.S
Die Schlüssel (FK: Fremdschlüssel, PK, Primärschlüssel, S: beleibiger Schlüssel) sind jeweils aus mindestens zwei Spalten zusammengesetzt.
Der letzte Join geht nicht auf die Primärtabelle zurück sondern auf eine andere dazugejointe.
Verhalten:
Hibernate setzt zuerst ein komplettes Statement ab und anschließend werden zusätzlich für jede gefundene Zeile je ein weiteres Statement für den letzten Join abgesetzt. So kommt man auf n+1 Statements,
obwohl alle Informationen beim ersten Statement bereits gelesen wurden. Das Statement welches durch Hibernate generiert wird, sieht prinzipiell so aus, wie das oben dargestellte. Ich verwende in der hql-Syntax "inner join fetch" und "outer join fetch" und habe in den XML-Mapping-Dateien fetch="join" eingestellt.
Frage:
Wie verhindert man die zusätzlichen Statements?
2. Beschreibung:
Es sollen Artikel gelesen werden und immer wenn es zu einer (im Programmkontext vorhandenen) Kundennummer eine Kunden-Artikel-Refernz gibt, soll diese mit einem join dazugelesen werden, aber
nur dann. Der Primärschlüssel der Kunden-Artikel-Refernz besteht aus Artikelnr und Kundennr.
Select artikel.* from artikel
left outer join kundenArtikelReferenz
on artikel.artikelnr = kundenArtikelReferenz.artikelNr and kundenArtikelReferenz.kundenNr = <Kundennummer>
where ...
Frage:
Gibt es in Hibernate eine Möglichkeit, eine zusätzliche Bedingung, die nicht in der Ausgangstabelle vorhanden ist, in einen join einzufügen (hier die Kundennummer), ohne dass man ein natives Statement absetzt?
Falls es gewünscht wird, stelle ich gerne weitere Informationen zur Verfügung.
|