Выберите столбцы только из таблицы соединений, не требуя объединения
Учитывая эти таблицы:
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 ответ
Я сомневаюсь, что есть способ сделать это с помощью HQL, потому что HQL работает с сущностями NHibernate, а OrderItems не является сущностью. В этом случае похоже, что вы на самом деле не используете какие-либо функции ORM, поэтому вы можете просто выполнить SQL-запрос - через NHibernate, если хотите. Просто позвони ISession.CreateSQLQuery()
,
Редактировать:
Я подозреваю, что причина, по которой NHibernate настаивает на объединении, заключается в следующем: вы попросили Id
свойства Order
а также Item
сущности, поэтому он должен убедиться, что в Order
а также Item
таблица для этих идентификаторов. Вполне возможно, что в OrderItems
таблица с идентификаторами, которые не существуют в Order
или же Item
, Конечно, это было бы плохим дизайном базы данных, и это маловероятно, но NHibernate не может быть уверен, что это не так, если он не смотрит на схему таблицы и не видит соответствующие внешние ключи - но я сомневаюсь, что он делает такие вещи, как тот.
Это всего лишь мои предположения. Вы можете попросить на форуме NHibernate более точный ответ от разработчиков.