2009-10-09 3 views
1

NHibernate의 기준 기능으로 작성한 쿼리가 있는데이를 최적화하려고합니다. 쿼리는 4 개의 테이블을 조인합니다. 쿼리가 작동하지만 생성 된 SQL은 반환하려는 정보가 아니라 4 개의 테이블에 대한 모든 열을 반환합니다. SetResultTransformer를 사용하여 반환 된 데이터를 개별적으로 모양 짓는 쿼리에 사용하지만 더 큰 sql이 서버에서 반환 될 때까지는 사용하지 않습니다.nhibernate 크로스 테이블 쿼리 최적화

여기

SELECT (all columns from all joined tables) 
FROM INDIVIDUAL this_ 
     inner join EXTERNAL_ID externalid1_ 
     on this_.INDIVIDUAL_GUID = externalid1_.GENERIC_GUID 
     inner join EXTERNAL_ID_TYPE externalid2_ 
     on externalid1_.EXTERNAL_ID_TYPE_GUID = externalid2_.EXTERNAL_ID_TYPE_GUID 
     inner join SYSTEM_SRC datasource3_ 
     on externalid2_.SYSTEM_SRC_GUID = datasource3_.SYSTEM_SRC_GUID 
WHERE externalid1_.EXTERNAL_ID_TEXT_1 = 96800 /* @p0 */ 
     and externalid2_.EXTERNAL_ID_TYPE_CODE = 'PATIENT' /* @p1 */ 
     and datasource3_.SYSTEM_SRC_CODE = 'TOUCHPOINT' /* @p2 */ 

난 단지 열 다시 개별 테이블에서 원하는 NHibernate에 기준

 return session.CreateCriteria(typeof(Individual)) 
      .CreateAlias("ExternalIdentifiers", "ExternalIdentifier") 
      .CreateAlias("ExternalIdentifier.ExternalIdentifierType", "ExternalIdentifierType") 
      .CreateAlias("ExternalIdentifierType.DataSource", "Datasource") 
      .Add(Restrictions.Eq("ExternalIdentifier.Text1", ExternalId)) 
      .Add(Restrictions.Eq("ExternalIdentifierType.Code", ExternalIdType)) 
      .Add(Restrictions.Eq("Datasource.Code", DataSourceCode)) 
      .SetResultTransformer(new NHibernate.Transform.RootEntityResultTransformer()); 

그리고 (NHProfiler)에서 생성 된 SQL입니다입니다. 투영을 설정할 수는 있지만 개인 유형은 잃어 버립니다.

이 또한 DetachedCriteria로 다시 작성할 수 있습니다.

내 유일한 옵션입니까?

답변

3

내가 정확히 같은 질문을했다 직접 NHibernate에 개발 팀 구성원 중 하나를 요청, 여기에 내가 가진 대답은 다음 기준 API와

, 당신이 할 수있는 유일한 것은 투사 목록을 사용하는 것입니다 루트 엔티티의 모든 속성을 포함하면 ... AliasToBeanResultTransformer를 사용해야합니다. 분명히 최적의 솔루션과는 거리가 먼

hql로 쿼리를 다시 작성할 필요가 없다면 매우 쉽게 할 수 있습니다. "MyEntity e join e.Association에서"라는 hql 쿼리는 엔티티 열과 연관 열을 모두 선택합니다 (기준과 관련된 문제와 동일). 그러나 "MyEntity e Join e.Association에서 전자를 선택하십시오"라는 hql 쿼리는 e의 열만 선택합니다.