【问题标题】:NHibernate HQL: left outer join with "with" clause does not workNHibernate HQL:带有“with”子句的左外连接不起作用
【发布时间】:2010-12-17 04:35:57
【问题描述】:

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

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

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

所需的 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

经过大量挖掘,我发现在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

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

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

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

关于如何完成这项工作的任何想法?谢谢。

-- 布赖恩

【问题讨论】:

    标签: nhibernate hql sql-order-by left-join


    【解决方案1】:

    这行得通:

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

    不完全直观或记录良好,但它可以完成工作。

    【讨论】:

    • 美丽。我希望这个 JPA 左连接限制查询更广为人知!我浪费了很多时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多