2011-03-14 4 views
1

빠른 NHibernate에 문제 :NHibernate 객체를 수화하지 않고 Criteria 내부 조인을 만드는 방법?

내가 가진 SQL 테이블 :

Item { Id, Name } 
ItemRange { Id, Name } 
ItemHasItemRange { Id, ItemId, ItemRangeId } 

매핑은 간단합니다, 그래서 나는 항목 클래스가 ItemHasItemRanges 수집 게으른로 매핑하고있다, 항목 ID 및 ItemRangeId 외국 키입니다 붙여 넣을 수 없습니다 가방.

특히 ItemRange에있는 모든 항목을 원하지만 연관된 ItemRangeObjects를 검색하지 않으려 고합니다. 범위를 좁히려면 내부 조인을 수행하고 싶습니다.

나는 그런 식으로 작업을 수행 할 때 : 그것은 잘 작동하지만 모든 ItemHasItemRange 개체는 Item.ItemHasItemRanges에뿐만 아니라 인출되어

c.CreateCriteria("Item", "i") 
    .CreateAlias("ItemHasItemRanges", "ihpr", JoinType.InnerJoin) 
    .Add(Restrictions.Eq("ihpr.ItemRange.Id", I18nHelper.CurrentItemRange.Id)); 

(게으른로 매핑됩니다) 컬렉션

Item.ItemHasItemRanges를 가져오고 싶지 않습니다. 시간이 걸리기 때문입니다. 난 그냥 결과 집합을 제한하기 위해 내부 조인 싶어요. NHibernate에서 가능합니까?

+0

'CreateAlias' 대신'CreateCriteria'를 사용하면 어떻게됩니까? –

+0

IMO, 예상대로 작동해야합니다. 명시 적으로 ('SetFetchMode'를 사용하여) 쿼리에서 FetchMode를 설정하려고 할 수 있습니다. –

+0

나는'.SetFetchMode ("ItemHasItemRanges", FetchMode.Lazy);와 함께 시도했다 - 생성 된 쿼리는 동일하다. 'CreateCriteria'와 같은 것 - CreateCriteria는 CreateAlias와 다른 점은 우리가 시작한 기준 대신 새로운 기준에 뿌리를 둔 객체를 반환하는 것뿐입니다. 모든 필드는 여전히 선택 목록에 있습니다. 심지어 게으르도록해야합니다. – Adam

답변

0

비슷한 설명했습니다. ItemHasItemRange 테이블에 ItemId 및 ItemRangeId에 대한 다중 인덱스가 없습니다. - id는 각 필드에 별도의 인덱스 만있었습니다. 성능이 매우 저조한 이유가 있습니다.

하지만 여전히 NHibernate 질문은 유효합니다. 결과를 좁히고 일반적으로 게으른 결합 된 모든 객체를 가져 오지 않는 조건에 대해서만 내부 조인을 만들 수 있습니까?

0

개요/개요를 표시하기 위해 이러한 개체를 검색하기를 원한다고 생각합니다. 실제로 그 중 하나를로드하지 않는 한 해당 개체에 대해 실제로 '수행'하지 않을 것이라고 생각하십니까?

그런 경우 '예상'으로 작업하는 것이 더 바람직하다고 생각합니다. 당신은 당신이 (당신이 관심있는 곳) 보여주고 싶은 속성이 모두 포함 된 (단순) 클래스를 만들어야합니다

  • : 다음은 시나리오입니다.

  • 당신은 NHibernate가 그 존재를 알 수 있도록 NHibernate로 그 클래스를 가져와야 할 것입니다.

  • 이제 다음과 같이 Criteria 문을 만들 수 있습니다. (도메인 클래스 작업).

  • 그런 다음 투영법을 지정해야합니다. 즉, Item 엔티티의 속성이 'DTO'/ View 클래스 (방금 만든 간단한 클래스)의 속성에 매핑되는 방식입니다.

  • AliasToBean ResultTransformer를 사용해야한다는 것을 지정하십시오.

그런 다음 기준 쿼리를 실행하십시오. NHibernate는 필요한 모든 데이터를 검색하는 데 필요한 가장 단순한 쿼리를 생성 할 수 있습니다.

가 나는 문제가 다른 곳이었다 알아 here

+0

이것은 좋은 생각이지만, 아이템 클래스는로드되어야하는 다른 몇 가지 다른 것들이 있습니다 (조인 된 변환 등). 그래서 모든 객체는 매핑에서 정의 된대로 정상적으로로드되기를 원하지만, 게으른 객체를로드하려면로드하지 않아도됩니다. 나는 FetchMode를 ItemHasItemRanges에 게으르도록 강제로 만들려고했지만 아무런 효과도 없다 - 생성 된 쿼리는 동일하다. – Adam