nhibernate criteria API가 수집 속성에 대한 예측을 지원합니까?
-
21-08-2019 - |
문제
기준 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();
제휴하지 않습니다 StackOverflow