Nhibernate, HQL левый порядок соединения по правому столбцу таблицы - PullRequest
0 голосов
/ 06 января 2012

Можно ли сделать левое соединение, но упорядочить по столбцу в правой таблице, используя 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 могут иметь значение null.

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>

и теперь, если я попытаюсь заказать SomeDocuments по Part1.Content:

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, выпуск 11.1.0.7.0 - 64 бита

1 Ответ

1 голос
/ 06 января 2012

Явно укажите nhibernate, что вы хотите левое соединение в запросе.

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

Если вы пропустите select doc из запроса, NHibernate выберет все объекты, в этом случае это будет эквивалентно записи select doc, part. Это создаст набор результатов типа object[], который представляет кортеж SomeDocument, DocumentPart.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...