2012-01-06 37 views
0

是否可以进行左连接,但是使用hql按右列中的列进行排序?Nhibernate,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; } 
} 

第一部分及第二和性能可为空。

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> 

,现在如果我尝试订购SomeDocumentsPart1.Content

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

我将只得到行,其中不为空。 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数据库11g企业版发布11.1.0.7.0 - 64位

回答

1

显式指定要在查询中进行左连接的nhibernate。

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

如果从查询离开了select doc,NHibernate的会选择所有的实体,在这种情况下,就等于写select doc, part。这将创建类型object[]的结果集,该结果集表示SomeDocument, DocumentPart的元组。

+0

ty先生。添加“select doc”查询字符串修复了问题。 – shkipper 2012-01-06 11:32:40

+0

认真,我每次都要手动写出连接?没有办法在映射中配置它?让人惊讶。 – 2012-04-16 13:47:05

+0

通常情况下,您可以将其配置为使用渴望的左连接,但在此查询中,我不确定结果是什么,因为'a.b.c'往往会创建从a到b的内连接。如果你不使用类似Transformers.DistinctRootEntity的东西,你可能会在结果中得到重复 – 2012-04-16 14:45:50