2

同様の質問がここここで尋ねられていることは承知しており、おそらく重複している可能性があります。

しかし、質問は両方の場所で適切に回答されていないので、しぶしぶ、もう一度質問する必要があります:(

問題は、Criteria API を使用して 2 つのテーブルを結合できるかどうかです。テーブル間にマッピングが利用できない場合です。

例えば

class Order{ UserId , OrderId} 
 class User{UserId , UserName}

次のようなクエリを作成する必要があります。

select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId

誰かがこれを認識している場合は助けてください..そして、CriteriaまたはQueryOverテクニックを使用してそれを行う必要があることに注意してください

ありがとう/BB

4

1 に答える 1

5

これを行う方法についてのアイデアは次のとおりですが、少し醜いです。

マッピングはOrderUserの間に関係が存在することを示していないため、NHibernate にこれら 2 つのテーブル間の結合を生成させることはかなり困難です。代わりにできることは、SQL としてのクエリが次のようになるように内部選択を行うことです。

SELECT o.OrderId, o.WhateverOtherPropertyNameFromOrder
       (SELECT u.UserName, u.WhateverOtherPropertyNameFromUser
        FROM   User u
        WHERE  u.UserId = o.UserId)
FROM   Order o

これは、QueryOver で次のように実行できます。

Order order = null;
User user = null;

QueryOver<User> query = QueryOver.Of<User>(() => user)
    .Select(Projections.ProjectionList()
               .Add(Projections.Property<User>(x => x.UserName)))
               .Add(Projections.Property<User>(x => x.WhateverOtherPropertyNameFromUser)))
    .Where(Restrictions.EqProperty("user.Id", "order.UserId"));

var result = session.QueryOver<Order>(() => order)
    .Select(Projections.ProjectionList()
            .Add(Projections.Property<Order>(c => c.OrderId))
            .Add(Projections.Property<Order>(c => c.WhateverOtherPropertyNameFromOrder))
            .Add(Projections.SubQuery(query)))
    .List<object[]>();

これがあなたにとって役立つかどうかはわかりませんが、問題の解決策になる可能性があります。

于 2011-01-21T00:49:34.087 に答える