Skip to content

Commit 5344197

Browse files
mp911deschauder
authored andcommitted
Fix identifier propagation for no-id list elements.
Original pull request #1618 See #1554
1 parent 5398b94 commit 5344197

File tree

2 files changed

+47
-64
lines changed

2 files changed

+47
-64
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/DefaultDataAccessStrategy.java

+22-4
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import static org.springframework.data.jdbc.core.convert.SqlGenerator.*;
1919

2020
import java.sql.ResultSet;
21+
import java.sql.SQLException;
2122
import java.util.Collections;
2223
import java.util.List;
2324
import java.util.Optional;
@@ -29,6 +30,7 @@
2930
import org.springframework.data.mapping.PersistentPropertyPath;
3031
import org.springframework.data.relational.core.conversion.IdValueSource;
3132
import org.springframework.data.relational.core.mapping.AggregatePath;
33+
import org.springframework.data.relational.core.mapping.AggregatePath.TableInfo;
3234
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
3335
import org.springframework.data.relational.core.mapping.RelationalPersistentEntity;
3436
import org.springframework.data.relational.core.mapping.RelationalPersistentProperty;
@@ -300,11 +302,27 @@ public Iterable<Object> findAllByPath(Identifier identifier,
300302
String findAllByProperty = sql(actualType) //
301303
.getFindAllByProperty(identifier, propertyPath);
302304

303-
RowMapper<?> rowMapper = path.isMap() ? this.getMapEntityRowMapper(path, identifier)
304-
: this.getEntityRowMapper(path, identifier);
305-
306305
SqlParameterSource parameterSource = sqlParametersFactory.forQueryByIdentifier(identifier);
307-
return operations.query(findAllByProperty, parameterSource, (RowMapper<Object>) rowMapper);
306+
return operations.query(findAllByProperty, parameterSource, new RowMapper<>() {
307+
308+
@Override
309+
public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
310+
311+
if (path.isMap()) {
312+
return getMapEntityRowMapper(path, identifier).mapRow(rs, rowNum);
313+
}
314+
315+
// Add row number as key for paths that do not defile an identifier and that are contained in a collection.
316+
Identifier identifierToUse = identifier;
317+
if (!path.hasIdProperty() && path.isQualified()) {
318+
319+
TableInfo tableInfo = path.getTableInfo();
320+
identifierToUse = identifierToUse.withPart(tableInfo.qualifierColumnInfo().name(), rowNum, Object.class);
321+
}
322+
323+
return getEntityRowMapper(path, identifierToUse).mapRow(rs, rowNum);
324+
}
325+
});
308326
}
309327

310328
@Override

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/AbstractJdbcAggregateTemplateIntegrationTests.java

+25-60
Original file line numberDiff line numberDiff line change
@@ -883,6 +883,9 @@ void saveAndLoadLongChainOfListsWithoutIds() {
883883
assertThat(saved.four).describedAs("Something went wrong during saving").isNotNull();
884884

885885
NoIdListChain4 reloaded = template.findById(saved.four, NoIdListChain4.class);
886+
887+
assertThat(reloaded.chain3).hasSameSizeAs(saved.chain3);
888+
assertThat(reloaded.chain3.get(0).chain2).hasSameSizeAs(saved.chain3.get(0).chain2);
886889
assertThat(reloaded).isEqualTo(saved);
887890
}
888891

@@ -1537,11 +1540,8 @@ public int hashCode() {
15371540

15381541
@Override
15391542
public String toString() {
1540-
final StringBuffer sb = new StringBuffer();
1541-
sb.append(getClass().getSimpleName());
1542-
sb.append(" [zeroValue='").append(zeroValue).append('\'');
1543-
sb.append(']');
1544-
return sb.toString();
1543+
String sb = getClass().getSimpleName() + " [zeroValue='" + zeroValue + '\'' + ']';
1544+
return sb;
15451545
}
15461546
}
15471547

@@ -1566,12 +1566,8 @@ public int hashCode() {
15661566

15671567
@Override
15681568
public String toString() {
1569-
final StringBuffer sb = new StringBuffer();
1570-
sb.append(getClass().getSimpleName());
1571-
sb.append(" [oneValue='").append(oneValue).append('\'');
1572-
sb.append(", chain0=").append(chain0);
1573-
sb.append(']');
1574-
return sb.toString();
1569+
String sb = getClass().getSimpleName() + " [oneValue='" + oneValue + '\'' + ", chain0=" + chain0 + ']';
1570+
return sb;
15751571
}
15761572
}
15771573

@@ -1596,12 +1592,8 @@ public int hashCode() {
15961592

15971593
@Override
15981594
public String toString() {
1599-
final StringBuffer sb = new StringBuffer();
1600-
sb.append(getClass().getSimpleName());
1601-
sb.append(" [twoValue='").append(twoValue).append('\'');
1602-
sb.append(", chain1=").append(chain1);
1603-
sb.append(']');
1604-
return sb.toString();
1595+
String sb = getClass().getSimpleName() + " [twoValue='" + twoValue + '\'' + ", chain1=" + chain1 + ']';
1596+
return sb;
16051597
}
16061598
}
16071599

@@ -1626,12 +1618,8 @@ public int hashCode() {
16261618

16271619
@Override
16281620
public String toString() {
1629-
final StringBuffer sb = new StringBuffer();
1630-
sb.append(getClass().getSimpleName());
1631-
sb.append(" [threeValue='").append(threeValue).append('\'');
1632-
sb.append(", chain2=").append(chain2);
1633-
sb.append(']');
1634-
return sb.toString();
1621+
String sb = getClass().getSimpleName() + " [threeValue='" + threeValue + '\'' + ", chain2=" + chain2 + ']';
1622+
return sb;
16351623
}
16361624
}
16371625

@@ -1658,13 +1646,9 @@ public int hashCode() {
16581646

16591647
@Override
16601648
public String toString() {
1661-
final StringBuffer sb = new StringBuffer();
1662-
sb.append(getClass().getSimpleName());
1663-
sb.append(" [four=").append(four);
1664-
sb.append(", fourValue='").append(fourValue).append('\'');
1665-
sb.append(", chain3=").append(chain3);
1666-
sb.append(']');
1667-
return sb.toString();
1649+
String sb = getClass().getSimpleName() + " [four=" + four + ", fourValue='" + fourValue + '\'' + ", chain3="
1650+
+ chain3 + ']';
1651+
return sb;
16681652
}
16691653

16701654
}
@@ -1692,11 +1676,8 @@ public int hashCode() {
16921676

16931677
@Override
16941678
public String toString() {
1695-
final StringBuffer sb = new StringBuffer();
1696-
sb.append(getClass().getSimpleName());
1697-
sb.append(" [zeroValue='").append(zeroValue).append('\'');
1698-
sb.append(']');
1699-
return sb.toString();
1679+
String sb = getClass().getSimpleName() + " [zeroValue='" + zeroValue + '\'' + ']';
1680+
return sb;
17001681
}
17011682
}
17021683

@@ -1721,12 +1702,8 @@ public int hashCode() {
17211702

17221703
@Override
17231704
public String toString() {
1724-
final StringBuffer sb = new StringBuffer();
1725-
sb.append(getClass().getSimpleName());
1726-
sb.append(" [oneValue='").append(oneValue).append('\'');
1727-
sb.append(", chain0=").append(chain0);
1728-
sb.append(']');
1729-
return sb.toString();
1705+
String sb = getClass().getSimpleName() + " [oneValue='" + oneValue + '\'' + ", chain0=" + chain0 + ']';
1706+
return sb;
17301707
}
17311708
}
17321709

@@ -1751,12 +1728,8 @@ public int hashCode() {
17511728

17521729
@Override
17531730
public String toString() {
1754-
final StringBuffer sb = new StringBuffer();
1755-
sb.append(getClass().getSimpleName());
1756-
sb.append(" [twoValue='").append(twoValue).append('\'');
1757-
sb.append(", chain1=").append(chain1);
1758-
sb.append(']');
1759-
return sb.toString();
1731+
String sb = getClass().getSimpleName() + " [twoValue='" + twoValue + '\'' + ", chain1=" + chain1 + ']';
1732+
return sb;
17601733
}
17611734
}
17621735

@@ -1781,12 +1754,8 @@ public int hashCode() {
17811754

17821755
@Override
17831756
public String toString() {
1784-
final StringBuffer sb = new StringBuffer();
1785-
sb.append(getClass().getSimpleName());
1786-
sb.append(" [threeValue='").append(threeValue).append('\'');
1787-
sb.append(", chain2=").append(chain2);
1788-
sb.append(']');
1789-
return sb.toString();
1757+
String sb = getClass().getSimpleName() + " [threeValue='" + threeValue + '\'' + ", chain2=" + chain2 + ']';
1758+
return sb;
17901759
}
17911760
}
17921761

@@ -1813,13 +1782,9 @@ public int hashCode() {
18131782

18141783
@Override
18151784
public String toString() {
1816-
final StringBuffer sb = new StringBuffer();
1817-
sb.append(getClass().getSimpleName());
1818-
sb.append(" [four=").append(four);
1819-
sb.append(", fourValue='").append(fourValue).append('\'');
1820-
sb.append(", chain3=").append(chain3);
1821-
sb.append(']');
1822-
return sb.toString();
1785+
String sb = getClass().getSimpleName() + " [four=" + four + ", fourValue='" + fourValue + '\'' + ", chain3="
1786+
+ chain3 + ']';
1787+
return sb;
18231788
}
18241789
}
18251790

0 commit comments

Comments
 (0)