1

我有一个结果图,例如:

    <resultMap type="cz.pse.agata.commons.dto.Security" id="detailed_security">
    <result property="id" column="VAID"/>
    <result property="issueId" column="VAIDVA"/>
    <result property="effectiveDate" column="VAEFDT"/>
    <result property="bic" column="VABIC"/>
    .
    .
    .
    <association property="isin" column="VACVAL" javaType="cz.pse.agata.commons.dto.ISIN">
        <result property="isin" column="VACVAL"/>
    </association>
    <association property="legalPerson" javaType="cz.pse.agata.commons.dto.LegalPerson"
            resultMap="legalPerson" columnPrefix="specialist_person_"/>
    </association>  
    <association property="emitent" column="VAEMIT" javaType="cz.pse.agata.commons.dto.LegalPerson"
        resultMap="cz.pse.agata.commons.dto.mapper.LegalPersonMapper.legalPerson"/>
    <association property="administrator" column="VAIDAD" javaType="cz.pse.agata.commons.dto.LegalPerson" 
        resultMap="legalPerson"/>
    <association property="changeReason" column="VAIDCD" javaType="cz.pse.agata.commons.dto.ChangeReason">
        <result property="id" column="CDID"/>
        <result property="reason" column="CDTEXT"/>
    </association>
    <association property="tail" javaType="Object">
         <discriminator javaType="String" column="VATVAL">
            <case value="000" resultType="cz.pse.agata.commons.dto.SecurityTailImpl">
                <result property="issueId" column="VAIDVA"/>
            </case>
            <case value="520" resultType="cz.pse.agata.commons.dto.SecurityTailImpl">
                <result property="issueId" column="VAIDVA"/>
            </case>
            <case value="100" resultMap="cz.pse.cp.dto.mapper.BondMapper.Bond"/>
            <case value="150" resultMap="cz.pse.cp.dto.mapper.BondMapper.Bond"/>
            <case value="200" resultMap="cz.pse.cp.dto.mapper.BondMapper.Bond"/>
            <case value="500" resultType="cz.pse.agata.commons.dto.SecurityTailImpl">
                <result property="issueId" column="VAIDVA"/>
            </case>
            <case value="510" resultType="cz.pse.agata.commons.dto.SecurityTailImpl">
                <result property="issueId" column="VAIDVA"/>
            </case>
            <case value="610" resultMap="cz.pse.cp.dto.mapper.WarrantMapper.Warrant"/>
            <case value="660" resultMap="cz.pse.cp.dto.mapper.WarrantMapper.Warrant">
                <result property="id" column="WAID"/>
            </case>
            <case value="600" resultMap="cz.pse.cp.dto.mapper.InvestementCertificateMapper.InvestementCertificate"/>
            <case value="650" resultMap="cz.pse.cp.dto.mapper.InvestementCertificateMapper.InvestementCertificate"/>
            <case value="300" resultType="cz.pse.agata.commons.dto.SecurityTailImpl">
                <result property="issueId" column="VAIDVA"/>
            </case>
            <case value="305" resultType="cz.pse.agata.commons.dto.SecurityTailImpl">
                <result property="issueId" column="VAIDVA"/>
            </case>
            <case value="400" resultType="cz.pse.agata.commons.dto.SecurityTailImpl">
                <result property="issueId" column="VAIDVA"/>
            </case>
        </discriminator>
    </association>
  </resultMap>

我有一个查询,它返回4行:

 ==>  Preparing: with dates as ( select vaefdt as dat from ....
 ==> Parameters: 109735(Long), 109735(Long), ....
<==      Total: 4

但结果列表只有3 个项目。

经过一些调试后,我意识到它发生(可能)是因为 4 行中有 2 行的所有数据都相同,但值除外:

(方法 org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleRowValuesForNestedResultMap(ResultSetWrapper, ResultMap, ResultHandler, RowBounds, ResultMapping))

private void handleRowValuesForNestedResultMap(ResultSetWrapper rsw, ResultMap resultMap, ResultHandler resultHandler, RowBounds rowBounds, ResultMapping parentMapping) throws SQLException { final DefaultResultContext resultContext = new DefaultResultContext(); skipRows(rsw.getResultSet(), rowBounds); Object rowValue = null; while (shouldProcessMoreRows(resultContext, rowBounds) && rsw.getResultSet().next()) { final ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(rsw.getResultSet(), resultMap, null); final CacheKey rowKey = createRowKey(discriminatedResultMap, rsw, null); Object partialObject = nestedResultObjects.get(rowKey); // issue #577 && #542 if (mappedStatement.isResultOrdered()) { if (partialObject == null && rowValue != null) { nestedResultObjects.clear(); storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet()); } rowValue = getRowValue(rsw, discriminatedResultMap, rowKey, rowKey, null, partialObject); } else { rowValue = getRowValue(rsw, discriminatedResultMap, rowKey, rowKey, null, partialObject); if (partialObject == null) { storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet()); } } } if (rowValue != null && mappedStatement.isResultOrdered() && shouldProcessMoreRows(resultContext, rowBounds)) { storeObject(resultHandler, resultContext, rowValue, parentMapping, rsw.getResultSet()); } }

注意上面的粗体文本:对于第二次迭代,创建了正确的rowValue,但它没有添加到结果中,因为partialObject不为空。

任何帮助,将不胜感激。

4

0 回答 0