2011-12-22 168 views
4

我有以下異常發生的看似隨意:NHibernate的 - NHibernate.Exceptions.GenericADOException:無法執行查詢

NHibernate.Exceptions.GenericADOException: could not execute query 
    [ select businesspr0_.BusinessProcessID as col_0_0_, businesspr0_.ProcessNumber as col_1_0_, businesspr1_.Name as col_2_0_, businesspr0_.DateCreated as col_3_0_, actor2_.DisplayName as col_4_0_, usergroup3_.Name as col_5_0_, processele5_.Name as col_6_0_ from BusinessProcess businesspr0_ inner join BusinessProcess businesspr1_ on businesspr0_.DefinitionID=businesspr1_.BusinessProcessID inner join Actor actor2_ on businesspr0_.ActorCreatedID=actor2_.ActorID left outer join UserGroup usergroup3_ on businesspr0_.UserGroupCreatedID=usergroup3_.UserGroupID left outer join Actor usergroup3_1_ on usergroup3_.UserGroupID=usergroup3_1_.ActorID inner join ActiveElement activeelem4_ on businesspr0_.BusinessProcessID=activeelem4_.BusinessProcessID inner join ProcessElement processele5_ on activeelem4_.ProcessElementID=processele5_.ProcessElementID inner join ProcessEmployees processemp6_ on businesspr0_.BusinessProcessID=processemp6_.BusinessProcessID inner join Actor actor7_ on processemp6_.ActorID=actor7_.ActorID inner join UserInGroups users8_ on actor7_.ActorID=users8_.UserGroupID inner join AppUser user9_ on users8_.UserID=user9_.UserID inner join Actor user9_1_ on user9_.UserID=user9_1_.ActorID where businesspr0_.IsDefinition=0 and (businesspr0_.Finished is null) and @p0=user9_.UserID ] 
     Name:userID - Value:32771 
    [SQL: select businesspr0_.BusinessProcessID as col_0_0_, businesspr0_.ProcessNumber as col_1_0_, businesspr1_.Name as col_2_0_, businesspr0_.DateCreated as col_3_0_, actor2_.DisplayName as col_4_0_, usergroup3_.Name as col_5_0_, processele5_.Name as col_6_0_ from BusinessProcess businesspr0_ inner join BusinessProcess businesspr1_ on businesspr0_.DefinitionID=businesspr1_.BusinessProcessID inner join Actor actor2_ on businesspr0_.ActorCreatedID=actor2_.ActorID left outer join UserGroup usergroup3_ on businesspr0_.UserGroupCreatedID=usergroup3_.UserGroupID left outer join Actor usergroup3_1_ on usergroup3_.UserGroupID=usergroup3_1_.ActorID inner join ActiveElement activeelem4_ on businesspr0_.BusinessProcessID=activeelem4_.BusinessProcessID inner join ProcessElement processele5_ on activeelem4_.ProcessElementID=processele5_.ProcessElementID inner join ProcessEmployees processemp6_ on businesspr0_.BusinessProcessID=processemp6_.BusinessProcessID inner join Actor actor7_ on processemp6_.ActorID=actor7_.ActorID inner join UserInGroups users8_ on actor7_.ActorID=users8_.UserGroupID inner join AppUser user9_ on users8_.UserID=user9_.UserID inner join Actor user9_1_ on user9_.UserID=user9_1_.ActorID where businesspr0_.IsDefinition=0 and (businesspr0_.Finished is null) and @p0=user9_.UserID] 
---> System.IndexOutOfRangeException: col_0_0_ 
     at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName) 
     at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name) 
     at NHibernate.Driver.NHybridDataReader.GetOrdinal(String name) 
     at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name) 
     at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names, ISessionImplementor session, Object owner) 
     at NHibernate.Hql.Ast.ANTLR.Loader.QueryLoader.GetResultColumnOrRow(Object[] row, IResultTransformer resultTransformer, IDataReader rs, ISessionImplementor session) 
     at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies) 
     at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 
     at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) 
     at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) 
     --- End of inner exception stack trace --- 
     at DotExe.TiCat.DomainModel.Repository.ProcessModel.BusinessProcessDAO.GetProcessForUserGroups(Int32 userID) in D:\Projects\TiCatRNIDS\DotExe.TiCat4\DotExe.TiCat.DomainModel.Repository\ProcessModel\BusinessProcessDAO.cs:line 98 
     at DotExe.TiCat4.UseCaseRepository.TicketProcess.TicketQueues.RefreshQueue() in D:\Projects\TiCatRNIDS\DotExe.TiCat4\DotExe.TiCat4\UseCaseRepository\TicketProcess\TicketQueues.cs:line 128 

奇數部分是System.IndexOutOfRangeException:col_0_0_我無法弄清楚爲什麼發生。 如有必要,我可以使用一些xml映射更新文章。

TNX

更新:

映射和查詢投擲前:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DotExe.TiCat.DomainModel" namespace="DotExe.TiCat.DomainModel.Process"> 

    <class name="BusinessProcess" table="BusinessProcess"> 
    <id name="BusinessProcessID"> 
     <generator class="hilo"/> 
    </id> 
    <property name = "Name" length="1024" type="string" not-null ="false" /> 
    <property name = "Description" length="5000" type="string" not-null ="false" /> 
    <property name = "ProcessNumber" length="500" type="string" not-null ="false" /> 
    <property name = "CommentOnSolve" length="5000" type="string" not-null ="false" /> 
    <property name="IsDefinition" type="bool"/> 
    <property name="PlaningTimeToSpend" type="long"/> 
    <property name="SpendTime" type="long"/> 
    <property name="DateCreated" type="DateTime" not-null="false"/> 
    <property name="PlanToStart" type="DateTime" not-null="false"/> 
    <property name="PlanToFinish" type="DateTime" not-null="false"/> 
    <property name="Started" type="DateTime" not-null="false"/> 
    <property name="Finished" type="DateTime" not-null="false"/> 
    <property name="CustomerRequestCallBack" type="bool" not-null="false"/> 
    <property name="EscalationTimeLimitInPercents" type="int"/> 
    <property name="IsEscalated" type="bool"/> 
    <property name="IsInfinite" type="bool"/> 
    <many-to-one name="WorkingWeek" class="WorkingWeek" column="WorkingWeekID" not-null="false" lazy="false"/> 
    <many-to-one name="Priority" class="ProcessPriority" column="PriorityID" not-null="false" lazy="false"/> 
    <many-to-one name="UserCreated" class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorCreatedID" not-null="false" lazy="false"/> 
    <many-to-one name="UserSolved" class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorSolvedID" not-null="false" lazy="false"/> 
    <many-to-one name="GroupCreated" class="DotExe.TiCat.DomainModel.Actors.UserGroup" column="UserGroupCreatedID" not-null="false" lazy="false"/> 
    <many-to-one name="GroupSolved" class="DotExe.TiCat.DomainModel.Actors.UserGroup" column="UserGroupSolvedID" not-null="false" lazy="false"/> 
    <many-to-one name="Definition" class="BusinessProcess" column="DefinitionID" cascade="none" />  
    <set name="Elements" lazy="false" cascade="save-update"> 
     <key column="BusinessProcessID"/> 
     <one-to-many class="ProcessElement"/> 
    </set> 
    <set name="ActiveElements" table="ActiveElement" lazy="false" cascade="save-update"> 
     <key column="BusinessProcessID"/> 
     <many-to-many class="ProcessElement" column="ProcessElementID"/> 
    </set> 
    <set name="ProcessConsumers" table="ProcessConsumers" lazy="false" cascade="save-update"> 
     <key column="BusinessProcessID"/> 
     <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/> 
    </set> 
    <set name="ProcessEmployees" table="ProcessEmployees" lazy="false"> 
     <key column="BusinessProcessID"/> 
     <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/> 
    </set> 
    <set name="ProcessSupervisors" table="ProcessSupervisors" lazy="false"> 
     <key column="BusinessProcessID"/> 
     <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/> 
    </set> 
    <set name="Flows" lazy="false" cascade="save-update"> 
     <key column="BusinessProcessID"/> 
     <one-to-many class="SequenceFlow"/> 
    </set> 
    <set name="PriorityTimeRules" lazy="false" cascade="save-update"> 
     <key column="BusinessProcessID"/> 
     <one-to-many class="DotExe.TiCat.DomainModel.BusinessRules.PriorityTimeRule"/> 
    </set> 
    </class> 

    <class name="ProcessElement" table="ProcessElement"> 
    <id name="ProcessElementID"> 
     <generator class="hilo"/> 
    </id> 
    <property name = "Name" length="1024" type="string" not-null ="true" /> 
    <property name="IsDefinition" type="bool"/> 
    <property name="IsState" type="bool"/> 

    <many-to-one class="BusinessProcess" name="MemberOf" lazy="false" cascade="save-update" column="BusinessProcessID"/> 
    <many-to-one class="ProcessElement" name="Definition" column="DefinitionID"/> 

    <joined-subclass name="Activity"> 
     <key column="ActivityID"/> 
     <property name = "Name" length="1024" type="string" not-null ="true" /> 
     <property name = "Description" length="4000" type="string" not-null ="false" /> 
     <set name="States" > 
     <key column="ActivityID"/> 
     <one-to-many class="ActivityState"/> 
     </set> 

     <joined-subclass name="UserTask" table="UserTask"> 
     <key column="UserTaskID"/> 
     <property name="PlaningTimeToSpend" type="int"/> 
     <property name="SpendTime" type="int"/> 
     <property name="PlanToStart" type="DateTime" not-null="false"/> 
     <property name="PlanToFinish" type="DateTime" not-null="false"/> 
     <property name="Started" type="DateTime" not-null="false"/> 
     <property name="Finished" type="DateTime" not-null="false"/> 
     <set name="Comments"> 
      <key column="UserTaskID"/> 
      <one-to-many class="TaskComment"/> 
     </set> 
     <set name="UserTaskEmployees"> 
      <key column="UserTaskID"/> 
      <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/> 
     </set> 
     <set name="UserTaskSupervisors"> 
      <key column="UserTaskID"/> 
      <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/> 
     </set> 
     <set name="Priorities"> 
      <key column="UserTaskID"/> 
      <one-to-many class="UserTaskPriority"/> 
     </set> 
     <set name="AssignmentRules"> 
      <key column="UserTaskID"/> 
      <one-to-many class="DotExe.TiCat.DomainModel.BusinessRules.AssignmentRule"/> 
     </set> 
     <many-to-one class="DotExe.TiCat.DomainModel.UseCase.ClientApplicationConfig" name="Application" column="ApplicationConfigID"/> 
     <many-to-one class="UserTaskPriority" name="TaskPriority" column="TaskPriorityID"/> 
     </joined-subclass> 

     <joined-subclass name="SendTask"> 
     <key column="SendTaskID"></key> 
     <many-to-one name="EmailAccount" class="DotExe.TiCat.DomainModel.Config.EmailAccount" column="EmailAccountID" lazy="false"></many-to-one> 
     <many-to-one name="Template" class="DotExe.TiCat.DomainModel.Templates.Template" column="TemplateID" lazy="false"></many-to-one> 
     <set name="Actors" lazy="false"> 
      <key column="SendTaskID"></key> 
      <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"></many-to-many> 
     </set> 
     <set name="EmailMessages"> 
      <key column="SendTaskID"></key> 
      <one-to-many class="DotExe.TiCat.DomainModel.Email.EmailMessage"/> 
     </set> 
     </joined-subclass> 
    </joined-subclass> 

    <joined-subclass name="Gateway"> 
     <key column="GatewayID"/> 
     <joined-subclass name="ExclusiveGateway"> 
     <key column="ExclusiveGatewayID"/> 
     </joined-subclass> 
    </joined-subclass> 

    <joined-subclass name="Event"> 
     <key column="EventID"></key> 
     <property name="ExecutionTime" type="DateTime" not-null="false"></property> 

     <joined-subclass name="StartEvent"> 
     <key column="StartEventID"></key> 
     </joined-subclass> 

     <joined-subclass name="EndEvent"> 
     <key column="EntEventID"></key> 
     </joined-subclass> 
    </joined-subclass> 
    </class> 
    <class name="ActivityState" table="ActivityState"> 
    <id name="ActivityStateID"> 
     <generator class="hilo"/> 
    </id> 
    <property name = "Name" length="1024" type="string" not-null ="true" /> 
    <property name = "Description" length="4000" type="string" not-null ="false" /> 
    <many-to-one name="StateOf" class="Activity" column="ActivityID"/> 
    <property name="IsEndState" type="bool"/> 
    <property name="IsStartState" type="bool"/> 
    <property name="IsPauseState" type="bool"/> 
    <property name="IsProcessSerializationState" type="bool"/> 
    </class> 
    <class name="SequenceFlow" table ="SequenceFlow"> 
    <id name="SequenceFlowID"> 
     <generator class="hilo"/> 
    </id> 
    <many-to-one class="ProcessElement" name="Source" column="SourceID" lazy="false" cascade="save-update"/> 
    <many-to-one class="ProcessElement" name="Target" column="TargetID" lazy="false" cascade="save-update"/> 
    <many-to-one name="Process" class="BusinessProcess" column="BusinessProcessID" cascade="save-update"/> 
    </class> 
    <class name="UserTaskPriority" table ="UserTaskPriority"> 
    <id name="UserTaskPriorityID"> 
     <generator class="hilo"/> 
    </id> 
    <property name = "Name" length="1024" type="string" not-null ="true" /> 
    </class> 
    <class name="TaskComment" table ="TaskComment"> 
    <id name="TaskCommentID"> 
     <generator class="hilo"/> 
    </id> 
    <property name = "Comment" length="4000" type="string" not-null ="true" /> 
    <many-to-one name="Task" class="ProcessElement" column="UserTaskID"/> 
    <many-to-one name="Actor" class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/> 
    <many-to-one name="Process" class="BusinessProcess" column="BusinessProcessID"/> 
    <many-to-one name="Group" class="DotExe.TiCat.DomainModel.Actors.UserGroup" column="UserGroupID"/> 
    <property name="CommentTime" type="DateTime" not-null="false" /> 
    </class> 
    <class name="TransitionLog"> 
    <id name="TransitionLogID"> 
     <generator class="hilo"/> 
    </id> 
    <property name="LogDate" type="DateTime"/> 
    <property name="TaskStarted" type="DateTime" not-null ="false" /> 
    <property name="TaskEnded" type="DateTime" not-null ="false" /> 
    <property name="TimeSpend" type="int" not-null ="false" /> 
    <set name="SendToActors" table="SendToActorLog" lazy="false"> 
     <key column="TransitionLogID"/> 
     <many-to-many class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID"/> 
    </set> 
    <many-to-one name="Actor" class="DotExe.TiCat.DomainModel.Actors.Actor" column="ActorID" lazy="false"/> 
    <many-to-one name="Group" class="DotExe.TiCat.DomainModel.Actors.UserGroup" column="UserGroupID"/> 
    <many-to-one name="FromElement" class="ProcessElement" column="FromElementID" lazy="false"/> 
    <many-to-one name="ToElement" class="ProcessElement" column="ToElementID"/> 
    <many-to-one name="Process" class="BusinessProcess" column="BusinessProcessID"/> 
    <many-to-one name="LogType" class="LogType" column="LogTypeID" lazy="false"/> 
    <property name="Comment" length="4000" type="string" not-null ="false" /> 
    </class> 
    <class name="LogType"> 
    <id name="LogTypeID"/> 
    <property name = "Name" length="1024" type="string" not-null ="false" /> 
    <property name = "DisplayName" length="1024" type="string" not-null ="false" /> 
    </class> 

    <class name="ProcessPriority"> 
    <id name="ProcessPriorityID"/> 
    <property name = "Name" length="1024" type="string" not-null ="false" /> 
    <property name = "DisplayName" length="1024" type="string" not-null ="false" /> 
    </class> 

    <class name="WorkingWeek"> 
    <id name="WorkingWeekID"> 
     <generator class="hilo"/> 
    </id> 
    <property name="MondayFrom" type="DateTime" not-null="true"/> 
    <property name="MondayTo" type="DateTime" not-null="true"/> 
    <property name="TuesdayFrom" type="DateTime" not-null="true"/> 
    <property name="TuesdayTo" type="DateTime" not-null="true"/> 
    <property name="WednesdayFrom" type="DateTime" not-null="true"/> 
    <property name="WednesdayTo" type="DateTime" not-null="true"/> 
    <property name="ThursdayFrom" type="DateTime" not-null="true"/> 
    <property name="ThursdayTo" type="DateTime" not-null="true"/> 
    <property name="FridayFrom" type="DateTime" not-null="true"/> 
    <property name="FridayTo" type="DateTime" not-null="true"/> 
    <property name="SaturdayFrom" type="DateTime" not-null="true"/> 
    <property name="SaturdayTo" type="DateTime" not-null="true"/> 
    <property name="SundayFrom" type="DateTime" not-null="true"/> 
    <property name="SundayTo" type="DateTime" not-null="true"/> 
    <property name="Is24x7" type="bool"/> 
    <property name="Name" type="string" length="256" not-null="true"/> 
    <!--<set name="BusinessProcesses" cascade="none" lazy="false"> 
     <key column="WorkingWeekID"/> 
     <one-to-many class="BusinessProcess"/> 
    </set>--> 

    </class> 

</hibernate-mapping> 

和查詢:

IList<object[]> result = 
         session.CreateQuery(" select bp.BusinessProcessID, bp.ProcessNumber, def.Name as Definition," + 
              " bp.DateCreated, actor.DisplayName as UserCreated," + 
              " group.Name as GroupCreated, task.Name as ActiveTask " + 
              " from BusinessProcess bp " + 
              " join bp.Definition as def " + 
              " join bp.UserCreated as actor " + 
              " left join bp.GroupCreated as group " + 
              " join bp.ActiveElements as task" + 
              " join bp.ProcessEmployees as res" + 
              " join res.Users as users " + 
              " where bp.IsDefinition = false " + 
              " and bp.Finished is null" + 
              " and :userID = users.ActorID").SetParameter("userID", userID).List<object[]>(); 
+0

請這樣做。 – 2011-12-22 10:00:07

+0

更新,添加映射和查詢 – makcro 2011-12-22 10:15:45

+0

嘗試session.CreateSQLQuery – 2011-12-22 11:02:57

回答

1

,當我試圖我已經得到了這個錯誤將空值映射到非空值屬性(即整數)。請確保要麼確保sql值不可爲空,要麼只是使c#屬性爲空(public virtual int? NumberOfPoints { get; set; }

0

我不知道原因。但映射中有些奇怪:Activity有屬性「Name」,它已經映射到基類中。這可能會導致索引超出範圍。周圍可能有更多問題。

要非常小心使用諸如「Actors」之類的多對多並且不指定表名稱的組。定義另一個「演員」集合的風險很高,這會導致表格定義衝突。

確實無關:有些集合應該是相反的,因爲元素對父元素有引用。