代码之家  ›  专栏  ›  技术社区  ›  Kent Boogaart

仅从联接表中选择列而不需要联接

  •  0
  • Kent Boogaart  · 技术社区  · 16 年前

    给出这些表格:

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

    1 回复  |  直到 16 年前
        1
  •  1
  •   EMP    16 年前

    我怀疑是否有使用hql的方法,因为hql与nhibernate实体进行交易,而orderitems不是实体。在本例中,看起来您实际上没有使用任何orm特性,因此您可以简单地执行sql查询-如果您愿意,可以通过nhibernate。只要打电话 ISession.CreateSQLQuery() .

    编辑 :

    犯罪嫌疑人 NHibernate坚持加入的原因是:你要求它加入 Id 属性 Order Item 实体,因此它必须确保 秩序 项目 这些身份证的表格。可能有一行存在于 OrderItems 表中不存在ID 秩序 项目 . 当然,这样做是不好的数据库设计,而且不太可能,但是nhibernate不能确定不是这样,除非它查看表模式并看到适当的外键,但是我怀疑它是否会这样做。

    不过,这只是我的猜测。你可以问 NHibernate forum 从开发者那里得到更明确的答案。