2011-02-08 7 views
0

나는 FirstName과 LastName이라는 두 개의 필드가있는 테이블을 가지고있다. 이름을 검색하려면 FirstName + " " + Lastname을 포함하는 수식을 만들었습니다. 나는 다음과 같은 성명을하려고하면Hibernate Criterion and formula

는하지만 :

는 "제한 시간이 만료 전에 작업이나 서버의 완료에 경과 된 시간 초과 기간 응답하지 않습니다.

Restrictions.InsensitiveLike("empl.FullNameFormula", "% " + restriction.PersonName + " %") 

나는 오류가 나타납니다 . " 내가 대신 같은의 동일한 작업을 수행하려고하면

는하지만 작동합니다

Restrictions.Eq("empl.FullNameFormula", "% " + restriction.PersonName + " %") 

공식과 같은 문자를 구분을하려고에 오류가 있습니까?

NHibernate 버전 2.1.2.4000을 사용 중입니다.

업데이트 : 내 스택 트레이스는 다음과 같습니다 : 두 번째 비싼 테이블 스캔을 수행하는 동안

[SqlException (0x80131904): Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.] 
    System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) +1951450 
    System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) +4849003 
    System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) +194 
    System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +2394 
    System.Data.SqlClient.SqlDataReader.ConsumeMetaData() +33 
    System.Data.SqlClient.SqlDataReader.get_MetaData() +83 
    System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +297 
    System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) +954 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +162 
    System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32 
    System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141 
    System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12 
    System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader() +12 
    NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) +216 
    NHibernate.Impl.MultiCriteriaImpl.GetResultsFromDatabase(IList results) +310 
    NHibernate.Impl.MultiCriteriaImpl.List() +348 
    NHibernate.Impl.FutureCriteriaBatch.GetResultsFrom(IMultiCriteria multiApproach) +10 
    NHibernate.Impl.FutureBatch`2.GetResults() +88 
    NHibernate.Impl.FutureBatch`2.get_Results() +16 
    NHibernate.Impl.FutureBatch`2.GetCurrentResult(Int32 currentIndex) +52 
    NHibernate.Impl.<>c__DisplayClass4`1.<GetEnumerator>b__3() +53 
    NHibernate.Impl.<get_Enumerable>d__0.MoveNext() +73 
    System.Linq.Buffer`1..ctor(IEnumerable`1 source) +259 
    System.Linq.Enumerable.ToArray(IEnumerable`1 source) +81 
    xxx.DataAccess.PublicationRepository.Search(PublicationQuery restriction) in xxxx :197 
    layouts_www_xxx.RunSearch() in xxx:100 
    layouts_www_xxx.OnInit(EventArgs e) in xxxx :39 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +333 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Control.InitRecursive(Control namingContainer) +210 
    System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +378 
+0

. DB 문제가 의심됩니다. – Rippo

+0

또한이 프래그먼트가 실행되는 테이블의 전체 루트를 표현합니다. – Jaguar

+0

@Jaguar : 그것은 수천 개의 행에서 실행될 것이므로 실제로는 아무 것도 없습니다. – Dofs

답변

1

I would see what the actual SQL is being generated, you mention that this is part of a much larger search...

이 그래서이를 바탕 나는 것 중 하나 -

가) SQL 프로파일 러를 화재 및 생성되는 SQL을보고 SQL 관리에서이 작업을 실행 스튜디오

B)를 NHProf을 다운로드 SQL을 잡고 출력 SQL Management Studio를

C)를 사용 Log4Net에서 생성 된 SQL을 실행하고 SQL 관리에서 실행 스튜디오

MySql Workbench를 사용하지 않는다면이 서버가 MsSQL 서버라고 가정합니다.

이것은 실제로 SQL 데이터베이스 문제가 아니라 NHibernate 문제가 있습니다. SQL을 먼저 확인하지 않으면 잘못된 트리를 짖을 수 있습니다.

, 그때이 첫 번째 문에 대해 생성 된 SQL을 찾을 것이라고 문제를 추적하는 데이터베이스에 대해 실행 무엇 HTH

+0

나는 오류를 찾지 못했지만 오류를 디버깅하는 방법에 대한 좋은 설명을 주었기 때문에 문제가 해결 된 것으로 나타났습니다. – Dofs

+0

@Dofs에게 감사드립니다. 나는 어떤 오류가 있었는지에 흥미가 있습니다. – Rippo

1

당신은 아마, 첫 번째 쿼리를 돕고있다 FIRSTNAME에 인덱스를 가지고있다.

+0

meh, 몇 줄의 행으로 제한 시간이 충분하지 않습니다. – Jaguar

+0

전체 스택 추적으로 실제 예외를 게시합니다. –