0

鉴于这些表:

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 生成一个查询,只从连接表中选择列,而不需要连接?

4

1 回答 1

1

我怀疑是否有使用 HQL 的方法,因为 HQL 与 NHibernate 实体进行交易,而 OrderItems 不是实体。在这种情况下,看起来您实际上并没有使用任何 ORM 功能,因此您可以简单地执行 SQL 查询 - 如果您愿意,可以通过 NHibernate。只要打电话ISession.CreateSQLQuery()

编辑

怀疑NHibernate 坚持执行连接的原因是:您已经向它询问了and实体的Id属性,因此它必须确保and表中确实有这些 ID 的行。表中可能存在ID 不存在于or中的行。当然,这样做是糟糕的数据库设计,而且不太可能,但是 NHibernate 不能确定情况并非如此,除非它查看表模式并看到适当的外键 - 但我怀疑它是否会做类似的事情那。OrderItemOrderItemOrderItemsOrderItem

不过,这只是我的猜测。您可以在NHibernate 论坛上向开发人员询问更明确的答案。

于 2010-03-22T11:37:41.027 回答