I have a class with a subclass. When I use an ICriteria.List() call with expressions for the class, it creates a select clause with the columns of the sub-class. I have outer-join turned off in the NHibernate configuration section. When I use the Load() call with the primary key (composite), it works. The expression List() call fails with either a key on non-key property.
Hibernate version:
Using 1.2.0.Alpha1
Mapping documents:
Parent Class
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="PRG.CPFS.Objects.PackageTask,PRG.CPFS.Objects" table="package_task" lazy="true" dynamic-update="true" dynamic-insert="true" polymorphism="explicit">
<composite-id name="PackageTaskKey">
<key-property name="Package" column="[package]" type="Int32" />
<key-property name="Task" column="[task]" type="String"/>
</composite-id>
<discriminator />
<property column="[task_status]" type="String" name="TaskStatus" not-null="true" length="10" />
<property column="[created]" type="DateTime" name="Created" update="false" insert="false" not-null="true" />
<property column="[created_by]" type="String" name="CreatedBy" update="false" insert="false" not-null="true" length="256" />
<property column="[updated]" type="DateTime" name="Updated" update="false" insert="false" not-null="true" />
<property column="[updated_by]" type="String" name="UpdatedBy" update="false" insert="false" not-null="true" length="256" />
<property column="[sequence]" type="Int32" name="Sequence" not-null="true" />
<property column="[retry_count]" type="Int32" name="RetryCount" not-null="true" />
<property column="[subsequence]" type="Int32" name="Subsequence" />
<property column="[auto_ready]" type="Boolean" name="AutoReady" not-null="true" />
<property column="[emergency_hold]" type="Boolean" name="EmergencyHold" />
<property column="[initiated]" type="DateTime" name="Initiated" />
<property column="[initiated_by]" type="String" name="InitiatedBy" length="256" />
<many-to-one name="TaskStatusObject" class="PRG.CPFS.Objects.TaskStatus, PRG.CPFS.Objects" cascade="all">
<column name="[task_status]" />
</many-to-one>
<many-to-one name="TaskObject" class="PRG.CPFS.Objects.Task, PRG.CPFS.Objects" cascade="all">
<column name="[task]" />
</many-to-one>
<many-to-one name="PackageObject" class="PRG.CPFS.Objects.Package, PRG.CPFS.Objects" cascade="all">
<column name="[package]" />
</many-to-one>
</class>
</hibernate-mapping>
Sub-Class using table-per-class hierarchy strategy
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<subclass extends="PRG.CPFS.Objects.PackageTask,PRG.CPFS.Objects" name="PRG.CPFS.Objects.PackageTaskEx,PRG.CPFS.Objects" lazy="true" dynamic-update="true" dynamic-insert="true">
<property column="[status_class]" type="String" name="StatusClass" length="10" update="false" insert="false" />
<property column="[user_intervention]" type="Boolean" name="UserIntervention" update="false" insert="false" />
<property column="[external_system_intervention]" type="Boolean" name="ExternalSystemIntervention" update="false" insert="false" />
<property column="[reversal_process_required]" type="Boolean" name="ReversalProcessRequired" />
</subclass>
<sql-query name="ActivePackageTasks">
<return alias="PackageTaskEx" class="PRG.CPFS.Objects.PackageTaskEx,PRG.CPFS.Objects"/>
SELECT {PackageTaskEx.*} FROM [dbo].[vw_active_package_tasks] {PackageTaskEx} ORDER BY [package], [sequence], [subsequence]
</sql-query>
<sql-query name="ActivePackagesForTasks">
<return alias="PackageTaskEx" class="PRG.CPFS.Objects.PackageTaskEx,PRG.CPFS.Objects"/>
SELECT {PackageTaskEx.*} FROM [dbo].[vw_active_package_tasks] {PackageTaskEx}
WHERE [task] IN ( :task_list ) ORDER BY [package], [sequence], [subsequence]
</sql-query>
<sql-query name="ActivePackagesForTasksByStatus">
<return alias="PackageTaskEx" class="PRG.CPFS.Objects.PackageTaskEx,PRG.CPFS.Objects"/>
SELECT {PackageTaskEx.*} FROM [dbo].[vw_active_package_tasks] {PackageTaskEx}
WHERE [task] IN ( :task_list ) AND [task_status] IN ( :task_status_list ) ORDER BY [package], [sequence], [subsequence]
</sql-query>
<sql-query name="ActivePackagesByTaskStatus">
<return alias="PackageTaskEx" class="PRG.CPFS.Objects.PackageTaskEx,PRG.CPFS.Objects"/>
SELECT {PackageTaskEx.*} FROM [dbo].[vw_active_package_tasks] {PackageTaskEx}
WHERE [task_status] IN ( :task_status_list ) ORDER BY [package], [sequence], [subsequence]
</sql-query>
<sql-query name="ActiveTasksForPackages">
<return alias="PackageTaskEx" class="PRG.CPFS.Objects.PackageTaskEx,PRG.CPFS.Objects"/>
SELECT {PackageTaskEx.*} FROM [dbo].[vw_active_package_tasks] {PackageTaskEx}
WHERE [package] IN ( :package_list ) ORDER BY [package], [sequence], [subsequence]
</sql-query>
<sql-query name="ActiveTasksForChildPackages">
<return alias="PackageTaskEx" class="PRG.CPFS.Objects.PackageTaskEx,PRG.CPFS.Objects"/>
SELECT {PackageTaskEx.*} FROM [dbo].[vw_active_child_package_tasks] {PackageTaskEx}
WHERE [package_type] IN ( :child_package_type ) AND [parent_package] IN ( :package_list )
ORDER BY [package], [sequence], [subsequence]
</sql-query>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():
ICriteria de = Se.CreateCriteria( typeof( PackageTask ));
de.Add( new NHibernate.Expression.EqExpression( "PackageTaskKey.Package", 7900 ) );
IList<PackageTask> ws = de.List<PackageTask>();
Full stack trace of any exception that occurs:
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in c:\net\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1646
at NHibernate.Loader.Loader.ListIgnoreQueryCache(ISessionImplementor session, QueryParameters queryParameters) in c:\net\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1593
at NHibernate.Loader.Loader.List(ISessionImplementor session, QueryParameters queryParameters, ISet querySpaces, IType[] resultTypes) in c:\net\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1587
at NHibernate.Loader.Criteria.CriteriaLoader.List(ISessionImplementor session) in c:\net\nhibernate\nhibernate\src\NHibernate\Loader\Criteria\CriteriaLoader.cs:line 65
at NHibernate.Impl.SessionImpl.Find(CriteriaImpl criteria, IList results) in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 4907
at NHibernate.Impl.SessionImpl.Find[T](CriteriaImpl criteria) in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 4856
at NHibernate.Impl.CriteriaImpl.List[T]() in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\CriteriaImpl.cs:line 285
at ConsoleApplication1.TestHarness.Main(String[] args) in C:\Documents and Settings\bsayles\My Documents\Visual Studio 005\Projects\CPFS\TestHarness\TestHarness.cs:line 109
Inner Stack Trace
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at NHibernate.Impl.BatcherImpl.ExecuteReader(IDbCommand cmd) in c:\net\nhibernate\nhibernate\src\NHibernate\Impl\BatcherImpl.cs:line 224
at NHibernate.Loader.Loader.GetResultSet(IDbCommand st, RowSelection selection, ISessionImplementor session) in c:\net\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1289
at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in c:\net\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 393
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in c:\net\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 182
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in c:\net\nhibernate\nhibernate\src\NHibernate\Loader\Loader.cs:line 1636
Name and version of the database you are using:
MS SQL2000 SP3
The generated SQL (show_sql=true):
SELECT this_.[package] as column1_0_, this_.[task] as column2_0_, th
is_.[task] as column2_26_0_, this_.[sequence] as column9_26_0_, this_.[subsequen
ce] as column11_26_0_, this_.[package] as column1_26_0_, this_.[initiated] as co
lumn14_26_0_, this_.[initiated_by] as column15_26_0_, this_.[created] as column5
_26_0_, this_.[created_by] as column6_26_0_, this_.[updated_by] as column8_26_0_
, this_.[auto_ready] as column12_26_0_, this_.[emergency_hold] as column13_26_0_
, this_.[task_status] as column4_26_0_, this_.[retry_count] as column10_26_0_, t
his_.[updated] as column7_26_0_, this_.[status_class] as column16_26_0_, this_.[
user_intervention] as column17_26_0_, this_.[external_system_intervention] as co
lumn18_26_0_, this_.[reversal_process_required] as column19_26_0_, this_.class a
s class0_ FROM package_task this_ WHERE this_.[package] = @p0
@p0 = '7900'
Debug level Hibernate log excerpt:
Identical to stack trace in exception
NHibernate.ADOException text
could not execute query
SQLException Message text
Invalid column name 'status_class'.
Invalid column name 'user_intervention'.
Invalid column name 'external_system_intervention'.
Invalid column name 'reversal_process_required'.
Invalid column name 'class'.
|