Bug in Ibatis sqlMap when one resultMap has multiple results that are 
resultMaps...  then the groupby attribute only seems to work for the first 
embedded resultMap.
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

                 Key: IBATIS-406
                 URL: https://issues.apache.org/jira/browse/IBATIS-406
             Project: iBatis for Java
          Issue Type: Bug
          Components: SQL Maps
            Reporter: Shirley
            Priority: Blocker


In Ibatis using sqlMaps, we are able to do embedded resultMaps within 
resultMaps.  If we have one resultMap with only one result that is a resultMap 
(ie <result property="userAbsence" resultMap="User.UserAbsenceResult"/> )then 
using the groupby attribute has the effect of grouping by that property.
However, if we have one resultMap that has multiple results that are resultMap 
then the group by only works for the first embedded item.


Below is a working code snippet that uses embedded resultMaps.  Adding the 
groupby attribute forces the class that is returned to only return one item per 
groupby key. 
<resultMap id="UserResult"              
class="com.principal.ris.expwf.domain.User" groupBy="userId">
        <result property="userId"               column="USER_ID"/>
        <result property="userName"             column="USER_NM"/>      
        <result property="authLevelCode"        column="AUTH_LEVEL_CD"/>        
        <result property="certPrinCode"         column="CERT_PRIN_CD"/> 
        <result property="locationCode"         column="LOCATION_CD"/>  
        <result property="currentRoleCode"      column="CRNT_ROLE_CD"/> 
        <result property="skillChangeFlag"      column="SKL_CHG_FLG"/>  
        <result property="reprocessFlag"        column="RPRCS_FLG"/>    
        <result property="productUseCode"       column="PRDCT_USE_CD"/> 
        <result property="skillOrderFlag"       column="SKL_ORD_FLG"/>
        <result property="queueOrderFlag"       column="QUEUE_ORD_FLG"/>
        <result property="workGroupOrderCode"   column="WRK_GRP_ORD_CD"/>
        <result property="excludeLocationCode"          column="EXCL_LOC_CD"/>  
        <result property="workflowVersionCode"          column="WF_VRNS_CD"/>
        <result property="userAbsence" resultMap="User.UserAbsenceResult"/>
</resultMap>

<resultMap id="UserAbsenceResult" 
class="com.principal.ris.expwf.domain.UserAbsence" groupBy="absenceBeginDate" >
        <result property="userId"                                        
column="USER_ID"/>
        <result property="absenceBeginDate"                 
column="ABSN_BEG_DT"/>
        <result property="absenceEndDate"                    
column="ABSN_END_DT"/>
        <result property="absenceReasonCode"            column="ABSN_RSN_CD"/>
        <result property="backupUserId"                           
column="BKUP_USER_ID"/>
        <result property="absenceBeginTimeCount"      column="ABSN_BEG_TM_CNT"/>
        <result property="absenceEndTimeCount"         
column="ABSN_END_TM_CNT"/>               
</resultMap>

<select id="retrieveUser" parameterClass="java.lang.String" 
resultMap="UserResult">
        
                        SELECT
                                U.USER_ID,
                                U.USER_NM ,
                        U.AUTH_LEVEL_CD,
                        U.CERT_PRIN_CD,
                        U.LOCATION_CD,
                        U.CRNT_ROLE_CD,
                        U.SKL_CHG_FLG,
                        U.RPRCS_FLG,
                        U.PRDCT_USE_CD,
                        U.SKL_ORD_FLG,
                        U.QUEUE_ORD_FLG,
                        U.WRK_GRP_ORD_CD,
                        U.EXCL_LOC_CD,
                        U.WF_VRNS_CD,
                                S.SKILL_LEVEL_CD,
                        S.SKL_ORD_CD,
                        S.SKL_STAT_CD,
                        S.SKL_HOME_CD,
                        S.SKL_ORD_GRP_CD,
                        S.SKL_RORD_CD,
                        S.CHK_USR_ID,
                        A.ABSN_BEG_DT,
                        A.ABSN_END_DT,
                        A.ABSN_RSN_CD,
                        A.BKUP_USER_ID,
                        A.ABSN_BEG_TM_CNT,
                        A.ABSN_END_TM_CNT
                        from  XPRS_WF_USER U 
                                left outer join XPRS_WF_USER_SKL S
                                on U.USER_ID = S.USER_ID
                                left outer join XPRS_WF_USER_ABSN A
                                on U.USER_ID = A.USER_ID
                        where U.USER_ID=#value#
</select>

However if there is more than one result that is resultMap then the groupby 
attribute only seems to work for the first embedded item. Example below only 
does the grouping for the first embedded property ie (userAbsence).  When I 
switched it to have the userSkill before the userAbsence, then the group by 
only worked for the userSkill.

<resultMap id="UserResult" class="com.principal.ris.expwf.domain.User" 
groupBy="userId">
        <result property="userId"                       column="USER_ID"/>
        <result property="userName"                     column="USER_NM"/>      
        <result property="authLevelCode"                
column="AUTH_LEVEL_CD"/>        
        <result property="certPrinCode"                 column="CERT_PRIN_CD"/> 
        <result property="locationCode"                 column="LOCATION_CD"/>  
        <result property="currentRoleCode"              column="CRNT_ROLE_CD"/> 
        <result property="skillChangeFlag"              column="SKL_CHG_FLG"/>  
        <result property="reprocessFlag"                column="RPRCS_FLG"/>    
        <result property="productUseCode"               column="PRDCT_USE_CD"/> 
        <result property="skillOrderFlag"               column="SKL_ORD_FLG"/>
        <result property="queueOrderFlag"               column="QUEUE_ORD_FLG"/>
        <result property="workGroupOrderCode"        column="WRK_GRP_ORD_CD"/>
        <result property="excludeLocationCode"       column="EXCL_LOC_CD"/>     
        <result property="workflowVersionCode"       column="WF_VRNS_CD"/>
        <result property="userAbsence"  resultMap="User.UserAbsenceResult"/>
        <result property="userSkill"            
resultMap="User.UserSkillResult"/>
</resultMap>

<resultMap id="UserAbsenceResult" 
class="com.principal.ris.expwf.domain.UserAbsence" groupBy="absenceBeginDate" >
        <result property="userId"               column="USER_ID"/>
        <result property="absenceBeginDate"             column="ABSN_BEG_DT"/>
        <result property="absenceEndDate"               column="ABSN_END_DT"/>
        <result property="absenceReasonCode"       column="ABSN_RSN_CD"/>
        <result property="backupUserId"         column="BKUP_USER_ID"/>
        <result property="absenceBeginTimeCount"        
column="ABSN_BEG_TM_CNT"/>
        <result property="absenceEndTimeCount"          
column="ABSN_END_TM_CNT"/>              
</resultMap>

<resultMap id="UserSkillResult" 
class="com.principal.ris.expwf.domain.UserSkill" groupBy="skillLevelCode">
        <result property="userId"                       column="USER_ID"/>
        <result property="skillLevelCode"               
column="SKILL_LEVEL_CD"/>
        <result property="skillOrderCode"               column="SKL_ORD_CD"/>
        <result property="skillStatCode"                column="SKL_STAT_CD"/>
        <result property="skillHomeCode"                column="SKL_HOME_CD"/>
        <result property="skillOrderGroupCode"                                  
  column="SKL_ORD_GRP_CD"/>
        <result property="skillReorderCode"                               
column="SKL_RORD_CD"/>
        <result property="checkUserID"                  column="CHK_USR_ID"/>
</resultMap>

        

Planning to get around this by creating separate SQLs for the userAbesence and 
the userSkill.  Since we are only expecting 1 userID at a time we don't expect 
much overhead, then from the individual sqls for userSkill and userAbsence I 
can do the group by within the query.  Does anyone have any other suggestions?




-- 
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