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 / 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に生成させる方法はありますか?

4

1 に答える 1

1

HQLはNHibernateエンティティを処理し、OrderItemsはエンティティではないため、HQLを使用してそれを行う方法があるとは思えません。この場合、実際にはORM機能を使用していないように見えるので、必要に応じてNHibernateを介してSQLクエリを実行できます。だけお電話ISession.CreateSQLQuery()ください。

編集

NHibernateが結合を行うことを主張する理由はこれだと思います。エンティティのIdプロパティをOrder要求したので、それらのIDのとテーブルにItem実際に行があることを確認する必要があります。またはに存在しないIDを持つ行がテーブルに存在する可能性があります。確かに、それを行うのは悪いデータベース設計であり、それはありそうにありませんが、NHibernateは、テーブルスキーマを調べて適切な外部キーを確認しない限り、これが当てはまらないことを確認できません。それ。OrderItemOrderItemsOrderItem

しかし、これは私の推測です。NHibernateフォーラムで、開発者からのより明確な回答を求めることができます。

于 2010-03-22T11:37:41.027 に答える