2011-01-20 3 views
2

Я знаю, что аналогичный вопрос был задан here и here, и это может быть дубликат.NHibernate - присоединиться без картографирования

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

Вопрос заключается в использовании 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 

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

Благодаря /BB

ответ

5

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

Поскольку отображение не утверждает, что отношения между заказа и Пользователь существует поэтому довольно трудно иметь 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[]>(); 

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

+0

Спасибо, но я решил вместо этого добавить сопоставление. Знать, что это невозможно сделать без отображения действительно полезно. :) – Illuminati

+0

Чтобы уточнить, это ограничение только для API критериев. HQL и LINQ вполне способны к ad-hoc соединениям. –

+0

@ OskarBerggren вы можете уточнить? любая ссылка, которая описывает альтернативные методы? – syclee

Смежные вопросы