NHibernate HQL:带有"with"子句的左外连接不起作用

bri*_*rns 7 nhibernate hql sql-order-by left-join

在EAV系统中,我有一个如下所示的映射:

<class name="Record">
   <map name="Values" table="RecordFieldValue">
      <key column="RecordFK">
      <index column="FieldFK">
      <element column="Value">
   </map>
</class>
Run Code Online (Sandbox Code Playgroud)

我想选择一些记录,按特定字段的每个记录的值排序.但请注意,并非所有记录实际上都具有该字段的值.在这种情况下,仍应提取记录并使用空值进行排序.

所需的SQL如下所示:

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
Run Code Online (Sandbox Code Playgroud)

经过大量挖掘后,我发现在HQL中修改左连接的"on"子句的正确方法是使用"with"关键字(参见https://nhibernate.jira.com/browse/NH-514) .所以我尝试了这个HQL:

from Record rec
left join rec.Values vals with index(vals) = :field
order by vals
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会产生以下错误:with子句表达式没有引用与子句相关联的from子句元素.所以我尝试了这个:

from Record rec
left join rec.Values vals with index(rec.Values) = :field
order by vals
Run Code Online (Sandbox Code Playgroud)

但是这产生了一个新的错误:with子句只能引用驱动表中的列.

有关如何使这项工作的任何想法?谢谢.

- 布莱恩

bri*_*rns 9

这有效:

from Record rec
left join rec.Values vals with vals.index = :field
order by vals
Run Code Online (Sandbox Code Playgroud)

不完全直观或记录良好,但它完成了工作.