2010-12-17 8 views
7

In einem EAV-System funktioniert, ich habe eine Abbildung, die wie folgt aussieht:NHibernate HQL: links mit Outer-Joins „mit“ -Klausel nicht

<class name="Record"> 
    <map name="Values" table="RecordFieldValue"> 
     <key column="RecordFK"> 
     <index column="FieldFK"> 
     <element column="Value"> 
    </map> 
</class> 

Ich mag einige Datensätze wählen, um den Wert bestellt von jedem Datensatz für ein bestimmtes Feld. Beachten Sie jedoch, dass nicht alle Datensätze tatsächlich einen Wert für dieses Feld haben. In diesem Fall sollte der Datensatz immer noch abgerufen und mit einem Nullwert sortiert werden.

Die gewünschte SQL würde wie folgt aussehen:

select rec.*, val.Value 
from Record rec 
left outer join RecordFieldValue val 
on val.RecordFK = rec.PK and val.FieldFK = :field 
order by val.Value 

Nach viel zu graben, fand ich, dass der richtige Weg, die „auf“ -Klausel der linken in HQL beitreten zu ändern ist mit dem „mit“ Schlüsselwort (siehe https://nhibernate.jira.com/browse/NH-514). Also habe ich versucht, diese HQL:

from Record rec 
left join rec.Values vals with index(vals) = :field 
order by vals 

Leider ist dies erzeugt die folgenden Fehler: mit-Klausel Ausdrücke nicht aus-Klausel Referenzelement, an dem die mit-Klausel wurde verbunden. Also habe ich versucht, diese stattdessen:

from Record rec 
left join rec.Values vals with index(rec.Values) = :field 
order by vals 

Aber die einen neuen Fehler erzeugt hat: mit Klausel nur Spalten in der Ansteuertabelle verweisen kann.

Irgendwelche Ideen, wie man diese Arbeit bekommt? Vielen Dank.

- Brian

Antwort

9

Dies funktioniert:

from Record rec 
left join rec.Values vals with vals.index = :field 
order by vals 

nicht gerade intuitiv oder gut dokumentiert, aber es wird die Arbeit getan.

+0

Kann das gleiche mit Criterias gemacht werden? –

+0

Schön. Ich wünschte, dass JPA Link Join Restriktion Abfrage wurde besser bekannt! Ich habe eine Menge Zeit verschwendet. –