仅从连接表中选择列而无需连接

时间:2010-03-22 10:04:42

标签: sql nhibernate hql criteria-api

鉴于这些表格:

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

1 个答案:

答案 0 :(得分:1)

我怀疑是否有办法使用HQL,因为HQL处理NHibernate实体而OrderItems不是实体。在这种情况下,看起来你实际上并没有使用任何ORM功能,所以你可以简单地做一个SQL查询 - 如果你愿意,可以通过NHibernate。只需致电ISession.CreateSQLQuery()

修改

怀疑 NHibernate坚持要求加入的原因是:您已经询问了IdOrder个实体的Item属性,因此必须确保OrderItem表中实际存在用于这些ID的行。 OrderItems表中可能存在一行,其中OrderItem中不存在ID。当然,这样做是不好的数据库设计并且它不太可能,但是NHibernate不能确定不是这种情况,除非它查看表模式并看到相应的外键 - 但我怀疑它是否像这一点。

但这只是我的推测。您可以在NHibernate forum上询问开发人员的更明确答案。