2017-03-15 1 views
-2

Ich versuche, die folgende HQL-Anweisung auszuführen:Hibernate HQL verbinden mit Konstruktor holen

 queryString = "select new DossierAccount(dossier,dossierAccount.accountNumber) from DossierAccount as dossierAccount join fetch dossierAccount.dossier as dossier" + 
        " where dossier.kycId.id != :kycId and dossierAccount.accountNumber in :accountNumbers"; 

Dies führt zu einer org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list Ausnahme. Wenn ich das "fetch" entferne, funktioniert es. Die Verknüpfung zwischen DossierAccount und Dossier wird jedoch als "faul" angegeben und ich möchte sie nicht ändern. Aber in diesem speziellen Fall brauche ich, dass das Dossier eifrig geladen wird.

Es funktioniert auch, wenn ich den Aufruf des Konstruktors durch die Variable "accountNumber" ersetzen. Aber ich muss die Anzahl der ausgewählten Eigenschaften hier reduzieren.

Gibt es eine Möglichkeit, dies mit einem eingebetteten Konstruktoraufruf in der Select-Anweisung zu tun?

Eine weitere Frage: Ich muss auch die Anzahl ausgewählter Eigenschaften des verbundenen Dossiers einschränken. Gibt es auch einen Weg, dies zu erreichen?

+0

Was passiert, wenn Sie 'fetch' entfernen und die Zuordnung' LAZY' beibehalten? – Tobb

+0

Das zugehörige Dossier ist nicht geladen, aber ich brauche es in diesem Fall – thmayr

+0

Was meinst du mit nicht geladen, gibt es keine Werte zu DossierAccount? – Tobb

Antwort

0

Jetzt bin ich noch einen Schritt weiter. Die folgende Abfrage wählt zumindest das Dossier, ohne dass die Verbindung zwischen dem DossierAccount erklärt und dem Dossier eifrig:

 queryString = "select new DossierAccount((select dossier from Dossier as dossier where dossier.dossierId=dossierAccount.dossier.dossierId),dossierAccount.accountNumber) from DossierAccount as dossierAccount" + 
        " where dossierAccount.dossier.kycId.id != :kycId and dossierAccount.accountNumber in :accountNumbers"; 

Dazu wird der folgende Konstruktor erforderlich:

public DossierAccount(Dossier dossier, AccountNumber accountNumber) { 
    this.accountNumber = accountNumber; 
    this.dossier  = dossier; 
} 

Doch diese lädt das ganze Dossier Daten im Speicher, die ich nicht brauche. Also habe ich versucht, mit der folgenden Aussage einen eingeschränkten Satz von Dossier Eigenschaften auszuwählen:

 queryString = "select new DossierAccount((select new Dossier(dossier.kycId,dossier.relationshipName) from Dossier as dossier where dossier.dossierId=dossierAccount.dossier.dossierId),dossierAccount.accountNumber) from DossierAccount as dossierAccount" + 
        " where dossierAccount.dossier.kycId.id != :kycId and dossierAccount.accountNumber in :accountNumbers"; 

Aber dies führt zu einem „ava.lang.UnsupportedOperationException: GetDataType() nicht durch ConstructorNode unterstützt“ Ausnahme