次のような結果マップがあります。
<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 ではないため、結果には追加されません。
どんな助けでも大歓迎です。