복붙노트

[SQL] NHibernate에 QueryOver가와에게 여러 SQL 쿼리와 DB 안타를 결과로 가져 오기

SQL

NHibernate에 QueryOver가와에게 여러 SQL 쿼리와 DB 안타를 결과로 가져 오기

나는 엔티티를 선택하고 관련 목록을 가져 오기 위해 노력하고있어 :

    Session.QueryOver<UserRole>()
           .Fetch(x => x.UsersInRole).Eager
           .List();

어떤 데이터베이스 안타가 많이 발생합니다. 첫 번째는 같은 것입니다 :

그리고 수백 개 이상의 개별 쿼리하는 뭔가를 다음과 같습니다

매핑은 다음과 같다 :

public class UserRoleMap : ClassMap<UserRole>
{
    public UserRoleMap()
    {
        Id(x => x.Id);
        Map(x => x.RoleName);
        HasManyToMany(x => x.UsersInRole)
        .Inverse()
        .LazyLoad()
        .Table("UsersInRoles");
    }
}

해결법

  1. ==============================

    1.나는이 문제가 우리가 기대해야 무엇이라고 말할 것입니다. 하자 우리는 시스템이 사용자와이 개 역할을하는 시나리오를 가지고

    나는이 문제가 우리가 기대해야 무엇이라고 말할 것입니다. 하자 우리는 시스템이 사용자와이 개 역할을하는 시나리오를 가지고

    User1 - Role1 // has only Role1
    User2 - Role1 // now we see that Role2 has more then User1
    User2 - Role2
    

    하자 말은, 첫 번째 쿼리 것을, 오직 사용자 1과 그 일대 일대 관계 Role1을 검색합니다. Role1에 대한 사용자의 설정은 (우리가 재사용 순간에 ISession에로드 개체 수 없습니다) 불완전 그래서 우리가 순간에 ISession에있는 것은, 오직 사용자 1입니다. 하지만 어떻게 하나는 우리가 어디 있는지 알아야합니까? Role1에 대한로드 된 모든 데이터가 또는 세션에 있지 않은지?

    Role1에 대한 데이터를로드하는 새로운 쿼리를 발행해야합니다. 그리고이 방법은, 우리는 마지막에 이러한 쿼리의 dosens을 가질 수 있습니다 ...

    내가 최선의 해결책 (나는 거의 모든 시나리오에서 사용하고있다)로 참조하면 일괄 처리 크기 설정입니다 : 19.1.5. 배치 페칭 사용하기

    HasManyToMany(x => x.UsersInRole)
      ...
      .BatchSize(25)
    

    컬렉션은 .BatchSize (25)와 매핑을 모두 표시하고 심지어 클래스 맵뿐만 아니라 그렇게. 즉 더 후 1 SQL 스크립트를 야기하지만, 할 말 없습니다 더 후 1 + (2-4) 일괄 크기와 페이지 크기에 따라.

  2. from https://stackoverflow.com/questions/19284228/nhibernate-queryover-with-fetch-resulting-multiple-sql-queries-and-db-hits by cc-by-sa and MIT license