문제

기준 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();

이 두 쿼리가 동일한 결과를 반환하지 않는 이유는 무엇입니까?

다음은 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 

다음은 기준 API 쿼리의 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 

부모와 자녀의 결합은 단방향입니다. 아동 실체에는 부모를 가리키는 참조 속성이 없습니다.

누구 든지이 한계를 해결할 수있는 대안을 제안 할 수 있습니까?

도움이 되었습니까?

해결책

여기에 '쿼리 전용'속성이 있습니다 http://ayende.com/blog/archive/2009/06/10/nhibernate-ndash-query and-properties.aspx

이를 통해 링크를 쿼리에 대해 양방향으로 보이게 할 수 있습니다.

다른 팁

어린이를 되 찾으려면 어린이 객체의 유형을 얻으려면 기준을 변경 한 다음 부모 ID를 선택으로 사용하는 것 같습니다.

session.CreateCriteria(typeof (Child))
.Add(Restrictions.Eq("Id", 33))
.CreateCriteria("Parent")
.Add(Restrictions.Eq("Id", 9))
.SetProjection(Projections.Property("Children"))
.SetMaxResults(3)
.List();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top