2010-07-07 4 views
3

개체를 나는 다음과 같은 기준 쿼리 (람다 확장을 사용하여)가이 제대로 작동NHibernate에이 - 손자에 모드를 가져 오기 설정

var workflowResult = repository.GetSession() 
       .CreateCriteria<Core.Domain.Application>() 
       .SetFetchMode<Core.Domain.Application>(app => app.ApplicationWorkflows, FetchMode.Join) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .Future<Core.Domain.Application>(); 

합니다. 각 응용 프로그램은 ApplicationWorkflow 컬렉션을 열심히로드합니다. 그러나 더 깊은 곳인 으로 이동하여 각 ApplicationWorkflow의 ApplicationStatus 개체를로드하고 싶습니다. 나는 다음과 같은 HQL 사용하여이 작업을 수행 할 수 하지만 기준에 번역 하시겠습니까 :

var workflowQuery = "SELECT DISTINCT app" + 
           " FROM Application app" + 
           " JOIN FETCH app.ApplicationWorkflows awf" + 
           " JOIN FETCH awf.ApplicationStatus"; 

나는 다음을 사용하는 것이 좋습니다 봤는데,하지만 모든 경우에 작업 그것으로 문제가 오전 :

.SetFetchMode<Core.Domain.Application>(app => app.ApplicationWorkflows[0].ApplicationStatus, FetchMode.Join) 
+0

HQL은 작동합니까? 나는 과거에 비슷한 것을 시도했고 중복에 문제가있었습니다. 'DistinctRootEntity'는 재귀 join-fetches를 할 때 예상했던 것을하지 않았습니다. –

+0

음, 생각했습니다. 확인하겠습니다. 머리를 주셔서 감사합니다! –

+0

[이 답변] (http://stackoverflow.com/questions/5266180/fighting-cartesian-product-x-join-when-using-nhibernate-3-0-0/5285739#5285739) 사용 방법을 알게되었습니다. QueryOver 및 Future 쿼리를 사용하여 중복을 반환하지 않고 자식 및 손자를 열심히 가져옵니다. 이 기술은 데이터베이스에 대해 한 번의 왕복으로 실행되는 별도의 SQL 쿼리로 작업을 나누는 작업을 포함합니다. –

답변

0

시도해보십시오.

var workflowResult = repository.GetSession() 
       .CreateCriteria<Core.Domain.Application>() 
       .CreateAlias("ApplicationWorkflows", "awf") 
       .SetFetchMode("ApplicationWorkflows", FetchMode.Join) 
       .SetFetchMode("awf.ApplicationStatus", FetchMode.Join) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .Future<Core.Domain.Application>(); 
+0

내가 마지막으로 확인한 시간에 손자를 할 때 DistinctRootEntity가 작동하지 않았습니다. 이것이 중복을 반환하지 않는지 확인하십시오. –

관련 문제