2009-04-09 4 views
1

Ich brauche eine Konstante aus einer HQL-Abfrage in nHibernate zurückzukehrenNHibernate: Rückkehr eine Konstante in HQL

SELECT new NDI.SomeQueryItem(user, account, " + someNumber + ") 
FROM NDI.SomeObject object 

Ich versuche, für so etwas wie oben. Ich habe dies versucht:

SELECT new NDI.SomeQueryItem(user, account, :someNumber) 
FROM NDI.SomeObject object 

Und dann später:

.SetParameter("someNumber", 1).List<SomeQueryItem>(); 

Aber im ersten Fall erhalte ich ein ‚Nicht definiert Alias ​​oder unbekannte Abbildung 1‘. Das macht einen gewissen Sinn, da es wahrscheinlich die 1 für einen Alias ​​hält.

Für die Sekunde bekomme ich ein 'Undefined Alias ​​oder unbekanntes Mapping: someNumber' was wiederum Sinn macht, wenn es nie den Parameter setzt.

Ich muss glauben, dass es einen Weg gibt, dies zu tun.

Antwort

2

Bitte zögern Sie nicht, weiterhin zu glauben, es gibt einen Weg, dies zu tun - aber mit HQL gibt es nicht!

Warum möchten Sie überhaupt? Wenn Sie den Wert dieser Eigenschaft auf den von Ihnen angegebenen Wert aktualisieren möchten, tun Sie dies, nachdem Sie die Objekte geladen haben. Wenn Ihre Ergebnismenge nicht ganz Ihren Objekten entspricht, können Sie alternativ eine SQL-Abfrage verwenden (die Sie immer noch über eine NHibernate-Sitzung ausführen können). Der Zweck von NHibernate besteht jedoch darin, Objekte in Ihrer Datenbank zuzuordnen, sodass die Angabe einer manuellen Überschreibung zu Recht nicht zulässig ist.

+0

"NHibernate ist das Zuordnen, was sich in Ihrer Datenbank auf Objekten befindet" Ein guter Punkt, ein Problem besteht darin, dass dieser Wert auf Werten außerhalb der Datenbank basiert und der Konstruktor des Elements auf dem Wert basiert. Es ist fast wie Relay-Informationen mit der Abfrage. Ich werde hier nicht richtig oder falsch argumentieren ... –

+0

Das Element kann es sich nicht leisten, Konstruktorlogik wie diese zu haben, wenn es ein NHibernate-Objekt ist - das verhindert, dass es die Art von POCO ist, mit der NHibernate arbeiten soll. –

+0

Ich hasse es, dass du genau darüber merkst. Ich denke, diese Frage könnte als intellektueller Selbstmord ... öffentlich und brutal abgetan werden. –

1

Es klingt wie eine (kleine?) Trennung zwischen Ihren Domain-Objekten und Ihrem Datenbankmodell. Wie wäre es mit einem kleinen "DTO" -Objekt, um diese Lücke zu überbrücken?

Lassen Sie Ihre Abfrage eine Liste von SomeQueryItemDTO (oder wie immer Sie es nennen möchten) zurückgeben, die aufgrund der Benennung, Sie wissen, kein echter Teil Ihrer Domäne ist. Dann haben Sie eine Funktion, um die Liste zu bearbeiten und eine Liste wahrer SomeQueryItem-Objekte zu erstellen, indem Sie die Daten einbeziehen, die für die Datenbank nicht relevant sind.

Wenn Sie bereits das Repository-Muster verwenden, sollte dies einfacher sein, da alle hässlichen Details in Ihrem Repository versteckt sind.