2009-03-17 4 views
3

nHibernate를 사용 중이고 일부 페이징을 구현하려고합니다. 이 코드를 실행하면nHibernate SetFirstResult & SetMaxResults 문제

IList list = session.CreateQuery("FROM Author").List(); 

8 개의 레코드가 반환됩니다. 그래도이 코드를 실행하면

IList list = session.CreateQuery("FROM Author") 
    .SetFirstResult(1).SetMaxResults(5).List(); 

0 레코드를 반환합니다. 생성 된 SQL을 보면 어떤 페이징 로직이 있는지 알 수 없습니다.

이 중 가장 오류가있는 것은 무엇입니까?

답변

1

올바른 구문을 사용하기 때문에 해당 테이블에 데이터가있는 한 왜 0 개의 결과가 반환 될지 잘 모르겠습니다.

생성 된 SQL에서 MSSQL Server는 LIMIT 및 OFFSET 명령을 지원하지 않으므로 서버에서 페이징을 해당 방식으로 구현할 수 없습니다. (n.b. SQL Server 2005에서는 페이징 방법이 향상되었지만 여전히 LIMIT 또는 OFFSET을 지원하지 않는다는 점을 이해해야합니다.) 따라서 SQL 2000에서는 모든 행을 검색 한 다음 해당 결과 집합에서 선택한 부분 집합을 검색해야합니다.

내가 제안 할 수있는 유일한 다른 점은 쿼리가 별도의 트랜잭션 내에 있는지 확인하는 것입니다. 나는 이것이 도움이 될 수 있다고 제안하는 게시물을 보았습니다. SetFirstResult/SetMaxResults를 사용하여 단위 테스트를 성공적으로 수행했기 때문에 무언가가있을 수 있습니다.

3

NHibernate에 대해 잘 모르겠지만 Java에서는 결과 인덱스가 0부터 시작됩니다. .SetFirstResult (1) 대신 .SetFirstResult (0)를 호출 해보십시오. 그렇지 않으면 행이 하나만 있으면 0 개의 결과가 반환됩니다. 8 행이있는 것처럼 들리므로 어느 경우에도 결과를 얻을 수없는 이유는 모르겠습니다.

0

어쩌면의 Web.config에 방언과 연결 제공자를 확인하거나의 app.config

<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property> 
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property> 
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>