【发布时间】:2010-03-22 10:04:42
【问题描述】:
鉴于这些表格:
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/criteria 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 生成一个查询,只从连接表中选择列,而不需要连接?
【问题讨论】:
-
您打算使用 Items 表进行排序还是过滤?如果只是过滤,那么 DetachedCriteria 就是要走的路。
-
@Kent - 澄清一下,OrdersItems 没有类,对吧?如果有,我认为这将是直截了当的。
-
@Michael:没错——没有明确的类/映射。理论上我可以创建一个,但我不愿意针对这种特殊情况。
标签: sql nhibernate hql criteria-api