1

OrderDetails のリストを持つ Order エンティティがある場合、NHibernateUtil.Initialize(Order.Details) を使用して、注文と共に詳細を簡単に読み込むことができます。したがって、NHibernate には、SQL ステートメントを生成するためのすべての情報が含まれていることは明らかです。しかし、条件を手動で作成せずに、詳細のみをデータベースに照会するにはどうすればよいでしょうか (Entity Framework の CreateSourceQuery に似ています)。NHibernateUtil.GetList(Order.Details) のようなものはありますか?

更新: Darin's answer this を使用して、最終的には最終的に終了しました。これは十分に一般的であり、エンティティ基本クラスで実装できます

Dim entity as EntityBase
Dim queryString = String.Format("select entityAlias.{1} from {0} entityAlias where entityAlias.id = :ID", entity.GetType.Name, collectionPropertyName)
Dim query = Session.CreateQuery(queryString).SetParameter("ID", entity.ID)
Return query.List
4

3 に答える 3

1

NHibernate でオブジェクトを照会する推奨される方法は、Criteria APIまたはHQLのいずれかを使用することです。これら 2 つのアプローチのいずれかに反対する理由はありますか?

var details = session.CreateCriteria<OrderDetails>().List<OrderDetails>();
var details = session.CreateQuery("from OrderDetails").List<OrderDetails>();

アップデート:

親オブジェクトをロードせずに関連付けのみをロードする場合は、次のクエリを使用できます。

var details = session.CreateQuery(
        "select " + 
        "  orderDetail" + 
        "from " + 
        "  Order order," + 
        "  OrderDetail orderDetail " + 
        "where " + 
        "  orderDetail in elements(order.Details)"
    )
    .List<OrderDetail>();
于 2009-10-31T12:33:17.397 に答える
1

Order をロードして、その Details コレクションにアクセスしないのはなぜですか? コレクションをロードできたとしても、リレーションシップには Order が必要なため、コレクションに追加することはできません。

NHibernateUtil.Initialize を誤用していると思います。その目的は、特別な場合にプロキシ コレクション (遅延ロード) の初期化を強制することです。一括読み込みは、遅延読み込みの反対です。そのシナリオでは、コレクションは常にその親オブジェクトとともにロードされ、プロキシは必要ありません。Order オブジェクトが既にある場合は、Details コレクションにアクセスすると、それが読み込まれます。熱心なフェッチが必要な場合は、マッピング オプションで設定できます。

于 2009-10-31T12:34:17.083 に答える
1

NHibernateには、あなたが求めていると思うことを正確に行うためのメソッドが組み込まれています。(ISession.CreateFilter)

たとえば、Orders という名前の注文のコレクションを持つ customer という名前の Customer エンティティが読み込まれている場合、これを行うことで注文を読み込むことができます。

var orderQuery = session.CreateFilter(customer.Orders, string.Empty);  
var orders = orderQuery.List<Order>();

これは以下と同じですが、少しきれいです。

var orderQuery = session.CreateQuery("from orders o where o.Customer.id = :customerId")
                        .SetParameter("customerId", customer.Id);
var orders = orderQuery.List<Order>();

コレクションをフィルタリングする場合は、hql where 句を 2 番目の引数として渡すことができますISession.CreateFilter(object, string)

于 2009-11-01T22:59:59.530 に答える