zerwi wrote:
ich hab mir jetzt mal als Ergebnismenge nur die ids ausgeben lassen -> schnell
Wenn Du das mit "select report.id ..." gemacht hast klar, dann müssen keine Objekte instanziiert werden.
Quote:
Also liegts wohl tatsächlich am Mapping, allerdings hab ich bereits alle Verbindungen auf lazy=true
Falls das angeführte Mapping aktuell war stimmt das nicht, es sind dort noch einige auf lazy=false
Quote:
<many-to-one not-null="true" column="id_vin" lazy="false" access="field" cascade="none" name="vin" class="com.its.base.vehicle.domain.Vin"/>
Quote:
Das Problem: innerhalb der Transaktion werden die Abhängigen Objekte trotzdem geladen, daher auch kein Geschwindigkeitsgewinn im Vergleich zu lazy=false
Großer Irrglaube, siehe unten.
lazy=false gilt noch dazu immer, ich persönlich bevorzuge es wenn ich selbst bestimmen kann wann und ob etwas eager geladen wird oder nicht.
Quote:
Das group by ist zur Vermeidung von Mehrfachtreffern.
Dafür gibt es "select DISTINCT", group by ist für Gruppierungen damit man sum, count oä machen kann.
Was Du noch ausgelassen hast ist die Bedeutung von DID und warum es im Join nicht vorkommt...
Folgender Ansatz um das zu vereinfachen
Zuerst wirfst Du alle lazy=true und lazy=false aus Deinem Mapping
Basisquery:
Code:
select distinct report from Report report where report.creation>='2009-01-10' and report.creation<='2009-02-11' order by report.creation desc
Für jede *-to-one Beziehung die Du für die Verarbeitung nachher brauchst fügst Du beispielsweise
Code:
inner join fetch report.creator
(wenn die Beziehung not-null=true hat)
bzw
Code:
left join fetch report.creator
(wenn not-null=false)
Das Schlüsselwort fetch sorgt dafür dass das angegeben Objekt mitgeladen wird
Die Sets in deinem Mapping ergänzt Du um fetch="subselect"
Code:
<set access="field" lazy="true" sort="com.its.report.domain.comparator.EmailComparator" cascade="none" name="emails" fetch="subselect">
Das sorgt dafür, dass wenn du für den ersten Report auf .getEmails() zugreifst für sämtliche Reports die Emails geladen werden.
Wichtig dafür ist nur, dass sich das alles innerhalb derselben Transaction abspielt, dh. kein commit oä dazwischen passiert.
Probier das mal aus und schau ob Du einen Unterschied bemerkst ;o)