【问题标题】:Nhibernate, HQL left join order by right table columnNhibernate,HQL按右表列左连接顺序
【发布时间】:2012-01-06 07:54:55
【问题描述】:

是否可以进行左连接,但使用 hql 按右表中的列排序?

例如,我们在域中有这些类:

public class SomeDocument
{
    public virtual int Id { get; set; }
    public virtual DocumentPart Part1 { get; set; }
    public virtual DocumentPart Part2 { get; set; }
}

public class DocumentPart
{
   public virtual int Id { get; set; }
   public virtual string Content { get; set; }
}

Part1 和 Part2 属性可以为空。

SQL:

create table SomeDocument
  (
    Id number(*, 0) not null,
    DocumentPart1_ID NUMBER,
    DocumentPart2_ID NUMBER
  );

create table DocumentPart
  (
    Id number(*, 0) not null,
    Content nvarchar2(250) not null
  );

映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Testapp.domain" namespace="Testapp.domain.model">
  <class name='SomeDocument' table='SomeDocument' lazy="false">
    <many-to-one name='Part1' class="Testapp.domain.model.DocumentPart, Testapp.domain" lazy="false" column='DocumentPart1_ID' cascade="save-update" />
    <many-to-one name='Part1' class="Testapp.domain.model.DocumentPart, Testapp.domain" lazy="false" column='DocumentPart2_ID' cascade="save-update" />
  </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Testapp.domain" namespace="Testapp.domain.model">
  <class name='DocumentPart' table='DocumentPart' lazy="false">
    <property name='Content' column='Content' not-null="true"/>
  </class>
</hibernate-mapping>

现在如果我尝试通过Part1.Content 订购SomeDocuments

UnitOfWork.CurrentSession
          .CreateQuery("from SomeDocument doc order by doc.Part1.Content")
          .List<SomeDocument>();

我只会得到DocumentPart1_ID 不为空的行。 NHibernate 会生成这样的 SQL:

select * from 
SomeDocument doc, 
DocumentPart docPart,
where doc.DocumentPart1_ID = docPart.Id
order by docPart.Content

但我想要的是这样的:

select * from 
SomeDocument doc
left join DocumentPart docPart on doc.DocumentPart1_ID = docPart.Id
order by docPart.Content

我的数据库是 Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    明确指定要在查询中使用左联接来休眠。

    select doc from SomeDocument doc left join doc.Part1 part order by part.Content
    

    如果您在查询中省略了select doc,NHibernate 将选择所有实体,在这种情况下,它相当于编写select doc, part。这将创建一个object[] 类型的结果集,它表示SomeDocument, DocumentPart 的元组。

    【讨论】:

    • 先生。将“select doc”添加到查询字符串修复了问题。
    • 说真的,我每次都要手动写出连接??没有办法在映射中配置它?哎呀。
    • 通常您可以将其配置为使用急切的左连接,但在此查询中我不确定结果是什么,因为a.b.c 倾向于创建从 a 到 b 的内连接。此外,如果您不使用 Transformers.DistinctRootEntity 之类的东西,您可能会在结果中得到重复
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2013-02-20
    相关资源
    最近更新 更多