NHibernate - присоединяйтесь без отображения - PullRequest
2 голосов
/ 21 января 2011

Мне известно, что подобный вопрос задавался здесь и здесь , и, возможно, это может быть дубликат.

Но на этот вопрос не было дано правильного ответа в обоих местах, поэтому неохотно, я должен задать его еще раз :(

Вопрос в том, можете ли вы использовать Criteria API для объединения двух таблиц, когда естьмежду ними нет сопоставления.

Например,

class Order{ UserId , OrderId} 
 class User{UserId , UserName}

, и мне нужно создать запрос вроде

select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId

Пожалуйста, помогите, если кто-нибудь знает об этом ..и, пожалуйста, обратите внимание, что мне нужно сделать это, используя методы Criteria или QueryOver

Спасибо / BB

1 Ответ

5 голосов
/ 21 января 2011

Вот идея о том, как это можно сделать, но это немного уродливо.

Поскольку в сопоставлении не указано, что существует связь между Order и User , поэтому довольно сложно заставить NHibernate создать соединение между этими двумя таблицами. Вместо этого вы можете сделать внутренний выбор, чтобы ваш запрос в виде SQL выглядел так:

SELECT o.OrderId, o.WhateverOtherPropertyNameFromOrder
       (SELECT u.UserName, u.WhateverOtherPropertyNameFromUser
        FROM   User u
        WHERE  u.UserId = o.UserId)
FROM   Order o

Это можно сделать так в QueryOver:

Order order = null;
User user = null;

QueryOver<User> query = QueryOver.Of<User>(() => user)
    .Select(Projections.ProjectionList()
               .Add(Projections.Property<User>(x => x.UserName)))
               .Add(Projections.Property<User>(x => x.WhateverOtherPropertyNameFromUser)))
    .Where(Restrictions.EqProperty("user.Id", "order.UserId"));

var result = session.QueryOver<Order>(() => order)
    .Select(Projections.ProjectionList()
            .Add(Projections.Property<Order>(c => c.OrderId))
            .Add(Projections.Property<Order>(c => c.WhateverOtherPropertyNameFromOrder))
            .Add(Projections.SubQuery(query)))
    .List<object[]>();

Я понятия не имею, полезно ли это вам вообще, но это потенциальное решение вашей проблемы.

...