queryForPaginatedList  doesn't play well with groupBy attribute of resultMap 
(N+1 selects solution)
---------------------------------------------------------------------------------------------------

         Key: IBATIS-274
         URL: http://issues.apache.org/jira/browse/IBATIS-274
     Project: iBatis for Java
        Type: Bug
  Components: SQL Maps  
    Versions: 2.1.7    
 Environment: WinXP Pro, WebLogic 8.1, JDK 1.4.2_05, Spring 1.2.7
    Reporter: Tim Haley


I have implemented the N+1 solution using the groupBy attribute of the 
resultMap.  

When this is called using queryForList() it works as expected; I get two 
BatchResults objects, the first contains a list of 20 ProcessingResult objects 
and the second contains a list of 19 ProcessingResult objects.

When called with queryForPaginatedList() and a page size of 10, I only get the 
first BatchResults object, which does contain the list of 20 ProcessingResult 
objects.  

When called with queryForPaginatedList() and a page size of 19, I only get both 
BatchResults objects, the first contains a list of 20 ProcessingResult objects 
and the second contains a list of 18 ProcessingResult objects. (total of 38, 2x 
the page size)

When called with queryForPaginatedList() and a page size of 18, I only get both 
BatchResults objects, the first contains a list of 20 ProcessingResult objects 
and the second contains a list of 16 ProcessingResult objects. (total of 36, 2x 
the page size)

When called with queryForPaginatedList() and a page size of 17, I only get both 
BatchResults objects, the first contains a list of 20 ProcessingResult objects 
and the second contains a list of 14 ProcessingResult objects. (total of 34, 2x 
the page size)


See details of mapping and method calls below:

    <resultMap id="BatchResultMap" class="BatchResult" 
groupBy="processingSchedule.processingKey">
        <result property="processingSchedule.processingKey" 
column="PROCESSING_KEY" javaType="int"/>
        <result property="processingSchedule.processingDate" 
column="PROCESS_DATE" javaType="date"/>
        <result property="processingSchedule.printDate" column="PRINT_DATE" 
javaType="date"/>
        <result property="processingSchedule.processType.processTypeKey" 
column="PROCESS_TYPE_KEY" javaType="int"/>
        <result property="processingSchedule.processType.description" 
column="PROCESS_TYPE_DESCRIPTION" javaType="string"/>
        <result property="processingResults" 
resultMap="Processing.ProcessResultMap"/>
    </resultMap>

    <resultMap id="ProcessResultMap" class="ProcessingResult">
        <!--<result property="processingKey" column="PR_PROCESSING_KEY"/>-->
        <result property="applicationKey" column="APPLICATION_KEY" 
javaType="int"/>
        <result property="applicationStatusKey" column="APPLICATION_STATUS_KEY" 
javaType="int"/>
        <result property="applicationStatusString" 
column="APPLICATION_STATUS_DESCRIPTION" javaType="string"/>
        <result property="testResults" column="{applicationKey=APPLICATION_KEY, 
processingKey=PR_PROCESSING_KEY}"
                select="getTestResultsForProcessingResult"/>
        <result property="application" column="APPLICATION_KEY" javaType="int"
                select="loadApplicationByPrimaryKey"/>
        <result property="processing" column="PR_PROCESSING_KEY" javaType="int"
                select="loadProcessingSchedule"/>
       </resultMap>
    <select id="loadBatchResultsForDateRange" parameterClass="DateRange" 
resultMap="BatchResultMap">
        select
            PRO.PROCESSING_KEY,
            PRO.PROCESS_DATE,
            PRO.PRINT_DATE,
            PRO.PROCESS_TYPE_KEY,
            PT.DESCRIPTION as PROCESS_TYPE_DESCRIPTION,
            PR.APPLICATION_KEY,
            ASCD.APPLICATION_STATUS_KEY,
            ASCD.DESCRIPTION as APPLICATION_STATUS_DESCRIPTION,
            PR.PROCESSING_KEY as PR_PROCESSING_KEY
        from
            WM.USTP_PROCESSING PRO
            join WM.USTP_PROCESS_TYPE_CD PT on PRO.PROCESS_TYPE_KEY = 
PT.PROCESS_TYPE_KEY
            left outer join WM.USTP_PROCESSING_RESULT PR on PR.PROCESSING_KEY = 
PRO.PROCESSING_KEY
            left outer join WM.USTP_APPLICATION_STATUS_CD ASCD on 
ASCD.APPLICATION_STATUS_KEY = PR.APPLICATION_STATUS_KEY
        where
            PRO.PROCESS_DATE between #start# and (#end#  + 1)
        order by
            PRO.PROCESSING_KEY desc

    </select>

    public List loadByProcessingDateRange(DateRange aDateRange)
            throws DataAccessException
    {
        return 
getSqlMapClientTemplate().queryForList("loadBatchResultsForDateRange", 
aDateRange);
    }

    public PaginatedList loadByProcessingDateRange(DateRange aDateRange,
                                                   int aPageSize)
            throws DataAccessException
    {
        return 
getSqlMapClientTemplate().queryForPaginatedList("loadBatchResultsForDateRange",
                                                               aDateRange, 
aPageSize); 
    }




-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to