Fix identifier propagation for no-id list elements.
Original pull request #1618 See #1554
This commit is contained in:
committed by
Jens Schauder
parent
5398b94020
commit
5344197ba6
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user