Выберите столбцы только из таблицы соединений, не требуя объединения - PullRequest
0 голосов
/ 22 марта 2010

С учетом этих таблиц:

create table Orders (
   Id INT IDENTITY NOT NULL,
   primary key (Id)
)

create table Items (
   Id INT IDENTITY NOT NULL,
   primary key (Id)
)

create table OrdersItems (
   OrderId INT not null,
   ItemId INT not null,
   primary key (OrderId, ItemId)
)

Можно ли использовать HQL / критерий API для построения запроса, который приводит к следующему SQL:

SELECT
    [OrderId], [ItemId]
FROM
    [OrdersItems]

Я пробовал обаиз этих подходов:

var hqlResults = session
    .CreateQuery("select order.id, item.id from Order order inner join order.Items item")
    .List();

var criteriaResults = session
    .CreateCriteria<Order>()
    .CreateAlias("Items", "item", NHibernate.SqlCommand.JoinType.None)
    .SetProjection(Projections.Property("id"), Projections.Property("item.id"))
    .List();

Но оба подхода настаивают на создании соединения (или сбое, потому что соединение не используется, при использовании критериев), что приводит к SQL, например:

select order.Id,
       item.Id
from   Orders order
       inner join OrdersItems ordersItems
         on order.Id = ordersItems.ArticleId
       inner join Items item
         on ordersItems.CategoryId = item.Id

Есть ли способ заставить NHibernate сгенерировать запрос, который выбирает столбцы только из таблицы соединений, без необходимости объединения?

1 Ответ

1 голос
/ 22 марта 2010

Я сомневаюсь, что есть способ сделать это, используя HQL, потому что HQL работает с сущностями NHibernate, а OrderItems не является сущностью. В этом случае похоже, что вы на самом деле не используете какие-либо функции ORM, поэтому вы можете просто выполнить SQL-запрос - через NHibernate, если хотите. Просто позвоните ISession.CreateSQLQuery().

Редактировать

Я подозреваю , что причина, по которой NHibernate настаивает на выполнении объединения, заключается в следующем: вы спросили его о Id свойствах Order и Item сущностей, поэтому он должен убедиться, что на самом деле строки в таблице Order и Item для этих идентификаторов. Возможно, в таблице OrderItems существует строка с идентификаторами, которых нет в Order или Item. Конечно, это будет плохой дизайн базы данных, и это маловероятно, но NHibernate не может быть уверен, что это не так, если он не смотрит на схему таблицы и не видит соответствующие внешние ключи - но я сомневаюсь, что он делает такие вещи, как что.

Это всего лишь мои предположения. На форуме NHibernate вы можете получить более точный ответ от разработчиков.

...