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()); } }

上記の太字のテキストに注意してください。2 回目の反復では、適切なrowValueが作成されますが、 partialObjectが null ではないため、結果には追加されません。

どんな助けでも大歓迎です。

4

0 に答える 0