-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 
Author Message
 Post subject: komplexe Joins composite keys n+1-Select-Problem
PostPosted: Mon Dec 15, 2008 12:26 pm 
Newbie

Joined: Mon Dec 15, 2008 11:52 am
Posts: 1
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.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Jan 09, 2009 12:44 pm 
Senior
Senior

Joined: Thu Jan 08, 2009 3:48 pm
Posts: 168
Hallo

Das im Mapping definierte fetch="join" wird nur bei get, load und Criteria-Query beachtet, bei HQL nicht. Steht irgendwo in der Anleitung.

Das von Dir angeführte Beispiel ist SQL, kannst Du bitte deine HQL-Query posten?

Ich weiss nicht was outer join fetch sein soll, ich vermute Du meinst "left join fetch"

Zusammengesetzt Schlüssel sind zwar machbar aber gibt es keine Möglichkeit hier einfach Hilfsschlüssel zu vergeben die einfach nur eine ID haben die hochgezählt wird und diese für Referenzen zu nutzen?
Für die zusammengesetzeten Keys kann man ja immer noch unique constraints definieren....

Für 2 wäre ein Beispiel gut was Du genau meinst, soll der zusätzliche Wert irgendwie zur Einschränkung der Haupt-Query verwendet werden?
In HQL geht das glaub ich nur wenn es im Mapping definiert ist (so dass es navigierbar wird), ev. in einem subselect.
Bei Criteria Query gibts die Möglichkeit Hibernate Queries und SQL zu mischen. In der Anleitung im Kapitel Criteria Query ist ein Beispiel.

lg

Patrik


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 2 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.