0

私はレガシー テーブルで NHibernate を使用しています。コードベースを調べたところ、この必要があるのは私だけのようです。クエリを実行できるように 2 つのテーブルを結合する必要がありますが、今日は何も進んでいません。コード スニペットで意味のある箇所は省略してみます。お手伝いしますか?

テーブル --

Order
 OrderID (primary key)
 OrderName
 OrderType
 OrderLocation

OrderAppendix
 ID (composite key)
 Key (composite key)
 Value (composite key)

OrderAppendix 複合キーの ID 部分は、Order テーブルの OrderID に関連付けられています。したがって、Order は OrderAppendix テーブルに複数のエントリを持つことができます。

ドメイン オブジェクト --

[Serializable]
public class Order
{
     public virtual string OrderID { get; set; }
     ...
     public virtual string OrderLocation { get; set; }
}

[Serializable]
public class OrderAppendix
{
     public virtual string ID { get; set; }
     public virtual string Key { get; set; }
     public virtual string Value { get; set; }

     public override bool Equals(object obj)
     {
          ...
     }

     public override int GetHashCode()
     {
          ...
     }
}

マッピング

internal sealed class OrderMap : ClassMap<Order>
{
     Table("Order");
     Id(x => x.OrderID).Column("OrderID").Length(20).GeneratedBy.Assigned();
     Map( x => x.OrderName).Column("OrderName")
     ....
}

internal sealed class OrderAppendixMap : ClassMap<OrderAppendix>
{
     Table("OrderAppendix");
     CompositeId()
         .KeyProperty(x => x.ID, "ID")
         ....
     Map( x => x.ID).Column("ID);
     ...
}

これらのテーブルを結合する無駄な試みでこれを混乱させるつもりはありませんが、結果がすべて OrderAppendix テーブルから同じ値を持っていることを前提として、OrderType や OrderLocation などでクエリを実行したいと考えています。

希望するSQLの例

SELECT * FROM ORDER
INNER JOIN
 ON Order.OrderID = OrderAppendix.ID
WHERE OrderAppendix.Key = "Stuff"

編集

「QueryOver」のドキュメントを読んで得た場所は次のとおりです。

http://nhibernate.info/doc/nh/en/index.html#queryqueryover

Order Order = null;
OrderAppendix OrderAppendix = null;

resultList = session.QueryOver<Order>(() => Order)
     .JoinAlias(() => Order.OrderAppendix, () => OrderAppendix)
     .Where(() => OrderAppendix.Key == "MatchThis")
     .List();

エイリアスを使用してテーブルに参加することは正しい方向に進んでいると思いますが、明らかに、必要な多対 1 のマッピングを NHibernate に通知する方法が見つかりませんでした。また、エイリアス機能を使用するために、OrderAppendix タイプのプロパティを Order に追加したことがわかります。

4

1 に答える 1

0

さて、注文側で HasMany を使用した標準的な親子アプローチと付録の参照を使用しなかった理由がわかりませんでした。これは付録側の複合キーのせい?

そうすれば、次の HQL を提供できます。

SELECT o FROM Order o LEFT JOIN FETCH o.apxs a WHERE a.Key="Stuff"

于 2013-09-18T10:28:36.393 に答える