Fix identifier propagation for no-id list elements.

Original pull request #1618
See #1554
This commit is contained in:
Mark Paluch
2023-10-12 14:20:31 +02:00
committed by Jens Schauder
parent 5398b94020
commit 5344197ba6
2 changed files with 47 additions and 64 deletions

View File

@@ -18,6 +18,7 @@ package org.springframework.data.jdbc.core.convert;
import static org.springframework.data.jdbc.core.convert.SqlGenerator.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@@ -29,6 +30,7 @@ import org.springframework.data.domain.Sort;
import org.springframework.data.mapping.PersistentPropertyPath;
import org.springframework.data.relational.core.conversion.IdValueSource;
import org.springframework.data.relational.core.mapping.AggregatePath;
import org.springframework.data.relational.core.mapping.AggregatePath.TableInfo;
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
import org.springframework.data.relational.core.mapping.RelationalPersistentProperty;
@@ -300,11 +302,27 @@ public class DefaultDataAccessStrategy implements DataAccessStrategy {
String findAllByProperty = sql(actualType) //
.getFindAllByProperty(identifier, propertyPath);
RowMapper<?> rowMapper = path.isMap() ? this.getMapEntityRowMapper(path, identifier)
: this.getEntityRowMapper(path, identifier);
SqlParameterSource parameterSource = sqlParametersFactory.forQueryByIdentifier(identifier);
return operations.query(findAllByProperty, parameterSource, (RowMapper<Object>) rowMapper);
return operations.query(findAllByProperty, parameterSource, new RowMapper<>() {
@Override
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
if (path.isMap()) {
return getMapEntityRowMapper(path, identifier).mapRow(rs, rowNum);
}
// Add row number as key for paths that do not defile an identifier and that are contained in a collection.
Identifier identifierToUse = identifier;
if (!path.hasIdProperty() && path.isQualified()) {
TableInfo tableInfo = path.getTableInfo();
identifierToUse = identifierToUse.withPart(tableInfo.qualifierColumnInfo().name(), rowNum, Object.class);
}
return getEntityRowMapper(path, identifierToUse).mapRow(rs, rowNum);
}
});
}
@Override

View File

@@ -883,6 +883,9 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
assertThat(saved.four).describedAs("Something went wrong during saving").isNotNull();
NoIdListChain4 reloaded = template.findById(saved.four, NoIdListChain4.class);
assertThat(reloaded.chain3).hasSameSizeAs(saved.chain3);
assertThat(reloaded.chain3.get(0).chain2).hasSameSizeAs(saved.chain3.get(0).chain2);
assertThat(reloaded).isEqualTo(saved);
}
@@ -1537,11 +1540,8 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [zeroValue='").append(zeroValue).append('\'');
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [zeroValue='" + zeroValue + '\'' + ']';
return sb;
}
}
@@ -1566,12 +1566,8 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [oneValue='").append(oneValue).append('\'');
sb.append(", chain0=").append(chain0);
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [oneValue='" + oneValue + '\'' + ", chain0=" + chain0 + ']';
return sb;
}
}
@@ -1596,12 +1592,8 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [twoValue='").append(twoValue).append('\'');
sb.append(", chain1=").append(chain1);
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [twoValue='" + twoValue + '\'' + ", chain1=" + chain1 + ']';
return sb;
}
}
@@ -1626,12 +1618,8 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [threeValue='").append(threeValue).append('\'');
sb.append(", chain2=").append(chain2);
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [threeValue='" + threeValue + '\'' + ", chain2=" + chain2 + ']';
return sb;
}
}
@@ -1658,13 +1646,9 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [four=").append(four);
sb.append(", fourValue='").append(fourValue).append('\'');
sb.append(", chain3=").append(chain3);
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [four=" + four + ", fourValue='" + fourValue + '\'' + ", chain3="
+ chain3 + ']';
return sb;
}
}
@@ -1692,11 +1676,8 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [zeroValue='").append(zeroValue).append('\'');
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [zeroValue='" + zeroValue + '\'' + ']';
return sb;
}
}
@@ -1721,12 +1702,8 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [oneValue='").append(oneValue).append('\'');
sb.append(", chain0=").append(chain0);
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [oneValue='" + oneValue + '\'' + ", chain0=" + chain0 + ']';
return sb;
}
}
@@ -1751,12 +1728,8 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [twoValue='").append(twoValue).append('\'');
sb.append(", chain1=").append(chain1);
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [twoValue='" + twoValue + '\'' + ", chain1=" + chain1 + ']';
return sb;
}
}
@@ -1781,12 +1754,8 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [threeValue='").append(threeValue).append('\'');
sb.append(", chain2=").append(chain2);
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [threeValue='" + threeValue + '\'' + ", chain2=" + chain2 + ']';
return sb;
}
}
@@ -1813,13 +1782,9 @@ abstract class AbstractJdbcAggregateTemplateIntegrationTests {
@Override
public String toString() {
final StringBuffer sb = new StringBuffer();
sb.append(getClass().getSimpleName());
sb.append(" [four=").append(four);
sb.append(", fourValue='").append(fourValue).append('\'');
sb.append(", chain3=").append(chain3);
sb.append(']');
return sb.toString();
String sb = getClass().getSimpleName() + " [four=" + four + ", fourValue='" + fourValue + '\'' + ", chain3="
+ chain3 + ']';
return sb;
}
}