2012-03-06 3 views
2

Nhibernate 3.2, Firebird Net Provider 2.7 및 기준을 사용하고 있습니다. 데이터베이스에 하나의 레코드 만 반환하는 방법에 대한 검색 결과.Nhibernate + Criteria + Firebird를 사용하여 데이터베이스에서 하나의 레코드 만 반환하는 방법?

var criteria = session.CreateCriteria(typeof(T)) 
    .SetFirstResult(0) 
    .SetMaxResults(1) 
    .Add(getRestricao(rest)) 
    .UniqueResult<T>(); 

tx.Commit(); 

return criteria; 

하지만 작동하지 않습니다! 하는 오류는 다음과 같습니다

NHibernate.Exceptions.GenericADOException : could not execute query 
[ /* criteria query */ SELECT this_.idPermissao as idPermis1_21_0_, this_.nomePermissao as nomePerm2_21_0_, this_.permissao as permissao21_0_ FROM Permissao this_ WHERE this_.nomePermissao = ? ] 
Name:cp0 - Value:Administrador 
[SQL: /* criteria query */ SELECT this_.idPermissao as idPermis1_21_0_, this_.nomePermissao as nomePerm2_21_0_, this_.permissao as permissao21_0_ FROM Permissao this_ WHERE this_.nomePermissao = ?] 
----> System.ArgumentException : index should be greater than or equal to 0 
Parameter name: index 

방법 기준에 파이어 버드에서 "FIRST 1 SELECT"를 생성하기 위해? 감사!

답변

1

.UniqueResult은 1 레코드 만 반환해야하며, 0이거나 둘 이상의 레코드가 반환되면 오류가 발생합니다.

SQL을 수동으로 실행하면 둘 이상의 레코드가 생성됩니까?

.List<T>()

.UniqueResult<T>()을 변경 한 다음 메서드 호출에서 첫 번째 항목을 반환하려고했다.

return criteria.FirstOrDefault(); 

만큼 당신이 당신의 최대 기록을 후 첫 번째 행은

+2

제로 기록이있는 경우는 null를 돌려, 그것은 예외를 throw하지 않습니다 반환 (또는 null)해야 유지한다. 만약 내가 틀렸다고 정정하되 결과가 둘 이상이면''NonUniqueResultException''을 던지지 않습니까? 참조 : [AbstractQueryImpl line 959] (https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/Impl/AbstractQueryImpl.cs#L959). – annemartijn

관련 문제