diff --git a/pom.xml b/pom.xml
index cc9055d8b01..8c0c07e9530 100644
--- a/pom.xml
+++ b/pom.xml
@@ -104,6 +104,10 @@
Tomáš Neuberg
neuberg@m-atelier.cz
+
+ Willie Scholtz
+ williescholtz@gmail.com
+
diff --git a/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java b/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java
index 255b94b5f2d..a07e14ee990 100644
--- a/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java
+++ b/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2009-2023 the original author or authors.
+ * Copyright 2009-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -293,6 +293,8 @@ private void settingsElement(Properties props) {
booleanValueOf(props.getProperty("argNameBasedConstructorAutoMapping"), false));
configuration.setDefaultSqlProviderType(resolveClass(props.getProperty("defaultSqlProviderType")));
configuration.setNullableOnForEach(booleanValueOf(props.getProperty("nullableOnForEach"), false));
+ configuration.setExperimentalConstructorCollectionMapping(
+ booleanValueOf(props.getProperty("experimentalConstructorCollectionMapping"), false));
}
private void environmentsElement(XNode context) throws Exception {
diff --git a/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java b/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
index 8cdc29d6377..9454c9f72bb 100644
--- a/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
+++ b/src/main/java/org/apache/ibatis/executor/resultset/DefaultResultSetHandler.java
@@ -24,6 +24,7 @@
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
@@ -73,6 +74,7 @@
* @author Eduardo Macarron
* @author Iwao AVE!
* @author Kazuki Shimizu
+ * @author Willie Scholtz
*/
public class DefaultResultSetHandler implements ResultSetHandler {
@@ -363,7 +365,7 @@ private void handleRowValuesForSimpleResultMap(ResultSetWrapper rsw, ResultMap r
skipRows(resultSet, rowBounds);
while (shouldProcessMoreRows(resultContext, rowBounds) && !resultSet.isClosed() && resultSet.next()) {
ResultMap discriminatedResultMap = resolveDiscriminatedResultMap(resultSet, resultMap, null);
- Object rowValue = getRowValue(rsw, discriminatedResultMap, null);
+ Object rowValue = getRowValue(rsw, discriminatedResultMap, null, null);
storeObject(resultHandler, resultContext, rowValue, parentMapping, resultSet);
}
}
@@ -406,9 +408,10 @@ private void skipRows(ResultSet rs, RowBounds rowBounds) throws SQLException {
// GET VALUE FROM ROW FOR SIMPLE RESULT MAP
//
- private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, String columnPrefix) throws SQLException {
+ private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, String columnPrefix, CacheKey parentRowKey)
+ throws SQLException {
final ResultLoaderMap lazyLoader = new ResultLoaderMap();
- Object rowValue = createResultObject(rsw, resultMap, lazyLoader, columnPrefix);
+ Object rowValue = createResultObject(rsw, resultMap, lazyLoader, columnPrefix, parentRowKey);
if (rowValue != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
final MetaObject metaObject = configuration.newMetaObject(rowValue);
boolean foundValues = this.useConstructorMappings;
@@ -437,7 +440,7 @@ private Object getRowValue(ResultSetWrapper rsw, ResultMap resultMap, CacheKey c
ancestorObjects.remove(resultMapId);
} else {
final ResultLoaderMap lazyLoader = new ResultLoaderMap();
- rowValue = createResultObject(rsw, resultMap, lazyLoader, columnPrefix);
+ rowValue = createResultObject(rsw, resultMap, lazyLoader, columnPrefix, combinedKey);
if (rowValue != null && !hasTypeHandlerForResultObject(rsw, resultMap.getType())) {
final MetaObject metaObject = configuration.newMetaObject(rowValue);
boolean foundValues = this.useConstructorMappings;
@@ -652,11 +655,13 @@ private CacheKey createKeyForMultipleResults(ResultSet rs, ResultMapping resultM
//
private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader,
- String columnPrefix) throws SQLException {
+ String columnPrefix, CacheKey parentRowKey) throws SQLException {
this.useConstructorMappings = false; // reset previous mapping result
final List> constructorArgTypes = new ArrayList<>();
final List