2010-06-04 4 views
2

나는 많은 관계가 많은 두 개의 데이터베이스 테이블, 즉 People과 Organization을 가지고있다. 물론 OrganizationPeople이라는 두 테이블을 연결하는 테이블이 있습니다.NHibernate에서 많은 개체를 쿼리하는 방법

NHibernate 매핑에서, 그들은 각각 다른 하나의 Bag을 가진다. 사람들의 매핑에, 가방은 다음과 같이 매핑됩니다 :

<bag name="Organizations" table="OrganizationPeople" cascade="none" inverse="false" lazy="true"> 
     <key column="PersonId"/> 
     <many-to-many column="OrgId" class="DataTransfer.Organization, DataTransfer" fetch="select"/> 
    </bag> 

과 조직의 매핑이 가방은 내가 지금하려고하는 것은 찾아 OrgId하여기구를 쿼리입니다

<bag name="Persons" table="OrganizationPeople" cascade="none" inverse="false" lazy="true"> 
     <key column="OrgId"/> 
     <many-to-many column="PersonId" class="DataTransfer.People, DataTransfer" fetch="select"/> 
    </bag> 

처럼 모든

public IList<Organization> GetByOrgIdAndUserId(System.Guid orgId) 
     { 
      return NHibernateSession.CreateQuery("from Organization o join o.Persons as p where o.OrgId = :orgId") 
       .SetGuid("orgId", orgId) 
       .List<Organization>(); 


     } 

이 내 단위 테스트가 반환 것입니다 :이 HQL을 사용 지을 수 있었던 사람들

NHibernate: select organizati0_.OrgId as OrgId21_0_, people2_.PersonId as PersonId12_1_, organizati0_.EmployerIdentificationNo as Employer2_21_0_, organizati0_.InactiveDate as Inactive3_21_0_, organizati0_.OrgName as OrgName21_0_, organizati0_.UDSId as UDSId21_0_, organizati0_.ExternalOrgTypeCode as External6_21_0_, organizati0_.OrgInstance as OrgInsta7_21_0_, organizati0_.DUNS as DUNS21_0_, organizati0_.ProfileFileNumber as ProfileF9_21_0_, organizati0_.CentralRegistryEntityIdentificationNo as Central10_21_0_, organizati0_.PMSOrganizationFlag as PMSOrga11_21_0_, organizati0_.PIN as PIN21_0_, organizati0_.CreatedDate as Created13_21_0_, organizati0_.LastUpdateDate as LastUpd14_21_0_, organizati0_.InstitutionCode as Institu15_21_0_, organizati0_.WebURL as WebURL21_0_, people2_.FirstName as FirstName12_1_, people2_.LastName as LastName12_1_, people2_.Title as Title12_1_, people2_.UserId as UserId12_1_, people2_.GenderCode as GenderCode12_1_, people2_.EmployeeTypeCode as Employee7_12_1_, people2_.EmployeeStatusCode as Employee8_12_1_, people2_.PreferredContactMethodCode as Preferre9_12_1_ from IKNSubmissions.dbo.ExternalOrganizations organizati0_ inner join IKNSubmissions.dbo.OrganizationPeople persons1_ on organizati0_.OrgId=persons1_.OrgId inner join IKNSubmissions.dbo.People people2_ on persons1_.PersonId=people2_.PersonId where [email protected];@p0 = b7a8fda8-a65a-4607-81ca-e374fe75d685 

System.ArgumentException: The value "System.Object[]" is not of type "IKN.DataTransfer.Organization" and cannot be used in this generic collection. 
Parameter name: value 
at System.ThrowHelper.ThrowWrongValueTypeArgumentException(Object value, Type targetType) 
at System.Collections.Generic.List`1.VerifyValueType(Object value) 
at System.Collections.Generic.List`1.System.Collections.IList.Add(Object item) 
at NHibernate.Util.ArrayHelper.AddAll(IList to, IList from) 
at NHibernate.Engine.Query.HQLQueryPlan.PerformList(QueryParameters queryParameters, ISessionImplementor session, IList results) 
at NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results) 
NHibernate.Exceptions.GenericADOException: Could not execute query[SQL: SQL not available] 
at NHibernate.Impl.SessionImpl.List(String query, QueryParameters queryParameters, IList results) 
at NHibernate.Impl.SessionImpl.List<T>(String query, QueryParameters parameters) 
at NHibernate.Impl.QueryImpl.List<T>() 
at IKN.DataAccess.OrganizationDao.GetByOrgIdAndUserId(Guid orgId) in OrganizationDao.cs: line 16 
at IKNDataAccessTest.OrganizationTest.CanGetByOrgId() in OrganizationTest.cs: line 42 

매핑을 기반으로 수정 된 쿼리가 생성 된 것 같지만 나중에 반환 결과를 만들 때 뭔가가 발생했습니다. 그러나 나는 이것이 무엇을 일으키는 지 확신하지 못한다.

도움을 주시면 대단히 감사하겠습니다.

답변

2

이 시도 : 당신이 그들에 액세스 할 때

return NHibernateSession.CreateQuery("select o from Organization o join o.Persons as p where o.OrgId = :orgId") 
    .SetGuid("orgId", orgId) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .List<Organization>(); 
+0

예! 그랬어! 정말 고맙습니다. 내 질문을 게시 한 후에 그런데 는,이 반환 NHibernateSession.CreateCriteria (대해서 typeof (기구)) .Add (Restrictions.Eq ("OrgId", orgId)) .CreateAlias ​​("사람을 시도 ","p ", JoinType.InnerJoin) .List (); 생성되며 생성 된 sql은 솔루션에서 생성 된 sql과 동일합니다. – John

+0

@ 존 : 여전히 'DistinctRootEntityResultTransformer' –

+0

마우리시오 (Mauricio)가 필요할 수도 있습니다. 내 단위 테스트는 그것없이 불평하지 않았습니다. DistinctRootEntityResultTransformer는 여기에서 필요하지 않을 수도 있습니다. 왜냐하면이 쿼리는 HQL 대신 ICriteria API를 사용하기 때문입니다. 그건 내 생각 이었어. – John

0

당신이 조인을 제거하면 내 생각은, 관련된 사람들 개체의 컬렉션이로드 게으른 될 것입니다. 동일한 쿼리에서 컬렉션을로드하려면 다음을 수행해야합니다.

select o from Organization o join fetch o.Persons as p where o.OrgId = :orgId 
+0

후세인, 입력 해 주셔서 감사합니다. 나는 노력했고 효과가 있었다. 하지만 "가져 오기"가 있거나없는 생성 된 SQL에는 차이점이 없습니다. 내가 뭐 놓친 거 없니? – John

관련 문제