2010-02-07 5 views
2

부모 (& 태그) 엔티티로 부모 & 자식으로 효율적으로 작업하려고합니다. 코드 예제는 다음에서 볼 수 있습니다. http://gist.github.com/297464Hiberate로 부모 및 자식 레코드를 효율적으로 반환

Post에 하나 이상의 태그가 포함되어있는 경우 10 개 미만의 개별 포스트 엔티티에서 다음 결과를 사용합니다. 나는 위의 .SetFetchMode 라인을 제거하면

var posts = session 
    .CreateCriteria<Post>() 
    .SetMaxResults(10) 
    .SetFetchMode("Tags", FetchMode.Eager) 
    .List<Post>(); 

, 나는 내가 찾고 오전 10 개 개의 레코드를 얻을 수 있지만, 태그 엔티티의 모든 조회 한 후 메모리에 필터링됩니다.

내가 NHiberate에 PostIds 목록을 전달하거나 조인을 지시 할 수 있어야하는 것처럼 보입니다.

저는 완전히 신빙성이 있으므로 완전히 잘못 될 것입니다.

감사합니다,
스콧

+0

태그 집합에 inverse = "true"가 있지만 다른 쪽 (태그 모음)이 주석 처리됩니다. 컬렉션을 소유하지 않은 경우에만 반대면을 원합니다. –

답변

2

문제는는 setMaxResults가 (SQLSERVER의 경우) 쿼리에서 반환 된 루트 기관의 수에 적용되지 않습니다, 그것이 T-SQL TOP로 번역이다,하는 조인 조회의 결과에 적용됩니다. 루트 엔터티의 각 하위에 대해 결과 집합에 행이 있으므로 TOP에는 원하는 효과가 없습니다.

루트 엔터티의 수를 제한하려면 SetMaxResults 제한이 포함 된 하위 쿼리를 사용하여 조인 쿼리를 사용할 수 있습니다.

// Select the ids of the first ten posts 
var subquery = DetachedCriteria.For<Post>() 
    .SetMaxResults(10) 
    .SetProjection(Projections.Property("Id")); 

// Do a join query with posts and tags, for the posts who's ids are 
// in the result of the subquery 
var posts = session.CreateCriteria<Post>() 
    .SetFetchMode("Tags", FetchMode.Join) 
    .Add(Subqueries.PropertyIn("Id", subquery)) 
    .SetResultTransformer(Transformers.DistinctRootEntity) 
    .List<Post>(); 
+0

팁 주셔서 감사. 그것은 제가 성취하고자했던 것에 훨씬 가깝습니다. 불행히도, 그것은 태그 당 raw를 반환하지만, 최종 결과는 현재 내가 달성하기를 바라고 있었던 것과 인라인입니다. 결국, 나는 태그를 게으른 로딩 (그리고 캐싱)하도록 할 생각이지만, 이것이 옵션인지를 아는 것이 좋다. 감사! –

+0

코드의 "태그"는 마법의 문자열입니다. 마술 문자열을 사용하지 않고 리팩토링 도구에서 "이름 바꾸기"를 활용할 수있는 방법이 있습니까? –

+0

http://code.google.com/p/nhlambdaextensions/에서보세요. –

관련 문제