8

基準APIを使用して、次の動作するHQLクエリを複製する必要があります。

session.CreateQuery(
    "select c " +
    "from Parent p " +
    "inner join p.Children c " +
    "where p.Id = 9 " +
    "and c.Id = 33")
    .SetMaxResults(3)
    .List();

クエリは、別の基準を満たす親に属する特定の基準を満たすすべての子を選択します。私の例では、両方の基準は単純なIdの等式ですが、何でもかまいません。

何らかの理由で、同等の基準APIクエリは正しい数のアイテムを含むリストを返しますが、それらのアイテムはすべてnullです。

session.CreateCriteria(typeof (Parent))
    .Add(Restrictions.Eq("Id", 9))
    .CreateCriteria("Children")
    .Add(Restrictions.Eq("Id", 33))
    .SetProjection(Projections.Property("Children"))
    .SetMaxResults(3)
    .List();

これらの2つのクエリが同じ結果を返さないのはなぜですか?

HQLクエリから生成されたSQLは次のとおりです。

SELECT   TOP 3 childid7_,
               name7_
FROM     (SELECT children1_.childid                 AS childid7_,
                 children1_.name                    AS name7_,
                 Row_number()
                   OVER(ORDER BY current_timestamp) AS __hibernate_sort_row
          FROM   dbo.parent parent0_
                 LEFT OUTER JOIN dbo.child children1_
                   ON parent0_.parentid = children1_.parentid
          WHERE  (parent0_.parentid = 9)
                 AND (children1_.childid = 33)) AS QUERY
WHERE    QUERY.__hibernate_sort_row > 0
ORDER BY QUERY.__hibernate_sort_row 

そして、これがCriteriaAPIクエリからのSQLです。

SELECT   TOP 3 y0_
FROM     (SELECT this_.parentid                     AS y0_,
                 Row_number()
                   OVER(ORDER BY current_timestamp) AS __hibernate_sort_row
          FROM   dbo.parent this_
                 INNER JOIN dbo.child child1_
                   ON this_.parentid = child1_.parentid
          WHERE  this_.parentid = @p0
                 AND child1_.childid = @p1) AS QUERY
WHERE    QUERY.__hibernate_sort_row > 0
ORDER BY QUERY.__hibernate_sort_row 

親と子の間の結合は単方向であることに注意してください。子エンティティには、その親を指す参照プロパティがありません。

誰かが私がこの制限を回避することを可能にする代替案を提案できますか?

4

2 に答える 2

1

子のみを戻したいように見えるので、条件を変更して子オブジェクトのタイプを取得し、親 ID を選択として使用する必要があります。

session.CreateCriteria(typeof (Child))
.Add(Restrictions.Eq("Id", 33))
.CreateCriteria("Parent")
.Add(Restrictions.Eq("Id", 9))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();
于 2009-08-24T18:13:44.537 に答える
1

ここに「クエリのみ」のプロパティがあることを確認してください http://ayende.com/Blog/archive/2009/06/10/nhibernate-ndash-query-only-properties.aspx

これにより、クエリに対してリンクを双方向に見せることができます。

于 2009-08-26T07:28:46.957 に答える