[ 
https://issues.apache.org/jira/browse/IBATISNET-206?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12472305
 ] 

Ihar Bury commented on IBATISNET-206:
-------------------------------------

The related Java iBATIS issue is IBATIS-375

> groupBy incorrectly handles left outer join results where right part is empty
> -----------------------------------------------------------------------------
>
>                 Key: IBATISNET-206
>                 URL: https://issues.apache.org/jira/browse/IBATISNET-206
>             Project: iBatis for .NET
>          Issue Type: Bug
>          Components: DataMapper
>    Affects Versions: DataMapper 1.6
>            Reporter: Ihar Bury
>
> We use the newly added groupBy functionality as follows:
>               <resultMap id="ConsumptionHistoryUsers" class="User" 
> groupBy="Id">
>                       <result property="Id" column="id" />
>                       ...
>                       <result property="filteredTopContentConsumptionHistory" 
> resultMapping="UserMap.ConsumptionHistoryUsersContent" />
>               </resultMap>
>               <resultMap id="ConsumptionHistoryUsersContent" class="Content">
>                       <result property="Id" column="content_id" />
>                       <result property="Creator" 
> resultMapping="UserMap.ConsumptionHistoryUsersContentCreator" />
>                       <result property="DateCreated" 
> column="content_date_created" />
>                       <result property="Title" column="content_title" />
>                       <discriminator type="int" column="content_subtype_id" />
>                       <subMap value="5" 
> resultMapping="ConsumptionHistoryUsersBlog" />
>               </resultMap>
>               <resultMap id="ConsumptionHistoryUsersBlog" class="BlogContent" 
> extends="UserMap.ConsumptionHistoryUsersContent">
>               </resultMap>
> The result map is for select SQL like
> select *
>   from User
>     left outer join Content on ...
> This works well in the cases where each selected User has at least one 
> Content joined to it. But when there is one User that doesn't have any 
> corresponding content, a failure occurs. The record returned from the 
> database has values for User and has null values for all Content columns. 
> iBATIS should just store an empty collection to the resulting User object in 
> this case but it tries to load all those nulls as a Content object. In our 
> case that ends up with NullReferenceException while analizing the 
> discriminator value.
>                               subMap = _discriminator.GetSubMap( 
> dataBaseValue.ToString() );
> where dataBaseValue == null
> >     
> > IBatisNet.DataMapper.dll!IBatisNet.DataMapper.Configuration.ResultMapping.ResultMap.ResolveSubMap(System.Data.IDataReader
> >  dataReader = {IBatisNet.DataMapper.Commands.DataReaderDecorator}) Line 444 
> >    C#
>       
> IBatisNet.DataMapper.dll!IBatisNet.DataMapper.MappedStatements.PropertStrategy.GroupByStrategy.Get(IBatisNet.DataMapper.Scope.RequestScope
>  request = {IBatisNet.DataMapper.Scope.RequestScope}, 
> IBatisNet.DataMapper.Configuration.ResultMapping.IResultMap resultMap = 
> {IBatisNet.DataMapper.Configuration.ResultMapping.ResultMap}, 
> IBatisNet.DataMapper.Configuration.ResultMapping.ResultProperty mapping = 
> {IBatisNet.DataMapper.Configuration.ResultMapping.ResultProperty}, ref object 
> target = {Tw.Core.BusinessLayer.ObjectModel.Users.User}, 
> System.Data.IDataReader reader = 
> {IBatisNet.DataMapper.Commands.DataReaderDecorator}) Line 99 + 0x19 bytes     
>   C#
>       
> IBatisNet.DataMapper.dll!IBatisNet.DataMapper.MappedStatements.PropertStrategy.GroupByStrategy.Set(IBatisNet.DataMapper.Scope.RequestScope
>  request = {IBatisNet.DataMapper.Scope.RequestScope}, 
> IBatisNet.DataMapper.Configuration.ResultMapping.IResultMap resultMap = 
> {IBatisNet.DataMapper.Configuration.ResultMapping.ResultMap}, 
> IBatisNet.DataMapper.Configuration.ResultMapping.ResultProperty mapping = 
> {IBatisNet.DataMapper.Configuration.ResultMapping.ResultProperty}, ref object 
> target = {Tw.Core.BusinessLayer.ObjectModel.Users.User}, 
> System.Data.IDataReader reader = 
> {IBatisNet.DataMapper.Commands.DataReaderDecorator}, object keys = null) Line 
> 71 + 0x15 bytes   C#
>       
> IBatisNet.DataMapper.dll!IBatisNet.DataMapper.MappedStatements.ResultStrategy.GroupByStrategy.Process(IBatisNet.DataMapper.Scope.RequestScope
>  request = {IBatisNet.DataMapper.Scope.RequestScope}, ref 
> System.Data.IDataReader reader = 
> {IBatisNet.DataMapper.Commands.DataReaderDecorator}, object resultObject = 
> null) Line 88 + 0x2e bytes   C#
>       
> IBatisNet.DataMapper.dll!IBatisNet.DataMapper.MappedStatements.ResultStrategy.MapStrategy.Process(IBatisNet.DataMapper.Scope.RequestScope
>  request = {IBatisNet.DataMapper.Scope.RequestScope}, ref 
> System.Data.IDataReader reader = 
> {IBatisNet.DataMapper.Commands.DataReaderDecorator}, object resultObject = 
> null) Line 64 + 0x14 bytes       C#
>       
> IBatisNet.DataMapper.dll!IBatisNet.DataMapper.MappedStatements.MappedStatement.RunQueryForList<Tw.Core.BusinessLayer.ObjectModel.Users.User>(IBatisNet.DataMapper.Scope.RequestScope
>  request = {IBatisNet.DataMapper.Scope.RequestScope}, 
> IBatisNet.DataMapper.ISqlMapSession session = 
> {IBatisNet.DataMapper.SqlMapSession}, object parameterObject = 
> {Tw.Core.DataLayer.Mappers.Users.UserMapper.UserConsumptionHistoryUsersParams},
>  
> System.Collections.Generic.IList<Tw.Core.BusinessLayer.ObjectModel.Users.User>
>  resultObject = null, 
> IBatisNet.DataMapper.RowDelegate<Tw.Core.BusinessLayer.ObjectModel.Users.User>
>  rowDelegate = null) Line 768 + 0x17 bytes     C#
>       
> IBatisNet.DataMapper.dll!IBatisNet.DataMapper.MappedStatements.MappedStatement.ExecuteQueryForList<Tw.Core.BusinessLayer.ObjectModel.Users.User>(IBatisNet.DataMapper.ISqlMapSession
>  session = {IBatisNet.DataMapper.SqlMapSession}, object parameterObject = 
> {Tw.Core.DataLayer.Mappers.Users.UserMapper.UserConsumptionHistoryUsersParams})
>  Line 643 + 0x45 bytes     C#
>       
> IBatisNet.DataMapper.dll!IBatisNet.DataMapper.SqlMapper.QueryForList<Tw.Core.BusinessLayer.ObjectModel.Users.User>(string
>  statementName = "GetUserConsumptionHistoryUsers", object parameterObject = 
> {Tw.Core.DataLayer.Mappers.Users.UserMapper.UserConsumptionHistoryUsersParams})
>  Line 1019 + 0x40 bytes     C#
> In a case without discriminator and subclasses, iBATIS attempts to create an 
> object with all values set to NULL, that is also incorrect.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to