Skip to content

Commit 15bb8d1

Browse files
schaudermp911de
authored andcommitted
Properly convert Map keys.
Keys of maps now get properly converted. Among others this enables the use of enums as keys. Closes #1656 Original pull request: #1663
1 parent f2da860 commit 15bb8d1

11 files changed

+96
-6
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ private Object getIdFrom(DbAction.WithEntity<?> idOwningAction) {
241241
RelationalPersistentEntity<?> persistentEntity = getRequiredPersistentEntity(idOwningAction.getEntityType());
242242
Object identifier = persistentEntity.getIdentifierAccessor(idOwningAction.getEntity()).getIdentifier();
243243

244-
Assert.state(identifier != null, "Couldn't obtain a required id value");
244+
Assert.state(identifier != null,() -> "Couldn't obtain a required id value for " + persistentEntity);
245245

246246
return identifier;
247247
}

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.data.relational.core.mapping.AggregatePath;
2424
import org.springframework.data.relational.core.sql.SqlIdentifier;
2525
import org.springframework.data.relational.domain.RowDocument;
26+
import org.springframework.data.util.TypeInformation;
2627
import org.springframework.jdbc.core.RowMapper;
2728

2829
/**
@@ -51,15 +52,19 @@ class MapEntityRowMapper<T> implements RowMapper<Map.Entry<Object, T>> {
5152
@Override
5253
public Map.Entry<Object, T> mapRow(ResultSet rs, int rowNum) throws SQLException {
5354

54-
Object key = rs.getObject(keyColumn.getReference());
55-
return new HashMap.SimpleEntry<>(key, mapEntity(rs, key));
55+
RowDocument document = RowDocumentResultSetExtractor.toRowDocument(rs);
56+
57+
Object key = document.get(keyColumn.getReference());
58+
Class<?> qualifierColumnType = path.getRequiredLeafProperty().getQualifierColumnType();
59+
Object convertedKey = converter.readValue(key, TypeInformation.of(qualifierColumnType));
60+
61+
return new HashMap.SimpleEntry<>(convertedKey, mapEntity(document, key));
5662
}
5763

5864
@SuppressWarnings("unchecked")
59-
private T mapEntity(ResultSet resultSet, Object key) throws SQLException {
65+
private T mapEntity(RowDocument document, Object key) {
6066

61-
RowDocument document = RowDocumentResultSetExtractor.toRowDocument(resultSet);
62-
return (T) converter.readAndResolve(path.getLeafEntity().getType(), document,
67+
return (T) converter.readAndResolve(path.getRequiredLeafEntity().getType(), document,
6368
identifier.withPart(keyColumn, key, Object.class));
6469
}
6570
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,6 +1278,16 @@ void recordOfSet() {
12781278
assertThat(authors).containsExactly(tolkien);
12791279
}
12801280

1281+
@Test // GH-1656
1282+
void mapWithEnumKey() {
1283+
1284+
EnumMapOwner enumMapOwner = template.save(new EnumMapOwner(null, "OwnerName", Map.of(Color.BLUE, new MapElement("Element"))));
1285+
1286+
Iterable<EnumMapOwner> enumMapOwners = template.findAll(EnumMapOwner.class);
1287+
1288+
assertThat(enumMapOwners).containsExactly(enumMapOwner);
1289+
}
1290+
12811291
private <T extends Number> void saveAndUpdateAggregateWithVersion(VersionedAggregate aggregate,
12821292
Function<Number, T> toConcreteNumber) {
12831293
saveAndUpdateAggregateWithVersion(aggregate, toConcreteNumber, 0);
@@ -2096,6 +2106,10 @@ record Book(String name) {
20962106

20972107
}
20982108

2109+
record EnumMapOwner(@Id Long id, String name, Map<Color, MapElement> map) {
2110+
}
2111+
2112+
20992113
@Configuration
21002114
@Import(TestConfiguration.class)
21012115
static class Config {

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-db2.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ DROP TABLE SET_ELEMENT;
5050
DROP TABLE BOOK;
5151
DROP TABLE AUTHOR;
5252

53+
DROP TABLE ENUM_MAP_OWNER;
54+
5355
CREATE TABLE LEGO_SET
5456
(
5557
"id1" BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
@@ -406,6 +408,8 @@ CREATE TABLE MAP_ELEMENT
406408
(
407409
MULTIPLE_COLLECTIONS BIGINT,
408410
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
411+
ENUM_MAP_OWNER BIGINT,
412+
ENUM_MAP_OWNER_KEY VARCHAR(10),
409413
NAME VARCHAR(100)
410414
);
411415

@@ -419,3 +423,9 @@ CREATE TABLE BOOK
419423
AUTHOR BIGINT,
420424
NAME VARCHAR(100)
421425
);
426+
427+
CREATE TABLE ENUM_MAP_OWNER
428+
(
429+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
430+
NAME VARCHAR(100)
431+
);

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-h2.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ CREATE TABLE MAP_ELEMENT
365365
(
366366
MULTIPLE_COLLECTIONS BIGINT,
367367
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
368+
ENUM_MAP_OWNER BIGINT,
369+
ENUM_MAP_OWNER_KEY VARCHAR(10),
368370
NAME VARCHAR(100)
369371
);
370372

@@ -378,3 +380,9 @@ CREATE TABLE BOOK
378380
AUTHOR BIGINT,
379381
NAME VARCHAR(100)
380382
);
383+
384+
CREATE TABLE ENUM_MAP_OWNER
385+
(
386+
ID SERIAL PRIMARY KEY,
387+
NAME VARCHAR(100)
388+
);

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-hsql.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,8 @@ CREATE TABLE MAP_ELEMENT
366366
(
367367
MULTIPLE_COLLECTIONS BIGINT,
368368
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
369+
ENUM_MAP_OWNER BIGINT,
370+
ENUM_MAP_OWNER_KEY VARCHAR(10),
369371
NAME VARCHAR(100)
370372
);
371373

@@ -379,3 +381,9 @@ CREATE TABLE BOOK
379381
AUTHOR BIGINT,
380382
NAME VARCHAR(100)
381383
);
384+
385+
CREATE TABLE ENUM_MAP_OWNER
386+
(
387+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
388+
NAME VARCHAR(100)
389+
);

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mariadb.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,8 @@ CREATE TABLE MAP_ELEMENT
339339
(
340340
MULTIPLE_COLLECTIONS BIGINT,
341341
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
342+
ENUM_MAP_OWNER BIGINT,
343+
ENUM_MAP_OWNER_KEY VARCHAR(10),
342344
NAME VARCHAR(100)
343345
);
344346

@@ -352,3 +354,9 @@ CREATE TABLE BOOK
352354
AUTHOR BIGINT,
353355
NAME VARCHAR(100)
354356
);
357+
358+
CREATE TABLE ENUM_MAP_OWNER
359+
(
360+
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
361+
NAME VARCHAR(100)
362+
);

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mssql.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,8 @@ CREATE TABLE MAP_ELEMENT
377377
(
378378
MULTIPLE_COLLECTIONS BIGINT,
379379
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
380+
ENUM_MAP_OWNER BIGINT,
381+
ENUM_MAP_OWNER_KEY VARCHAR(10),
380382
NAME VARCHAR(100)
381383
);
382384

@@ -393,3 +395,10 @@ CREATE TABLE BOOK
393395
AUTHOR BIGINT,
394396
NAME VARCHAR(100)
395397
);
398+
399+
DROP TABLE ENUM_MAP_OWNER;
400+
CREATE TABLE ENUM_MAP_OWNER
401+
(
402+
ID BIGINT IDENTITY PRIMARY KEY,
403+
NAME VARCHAR(100)
404+
);

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-mysql.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,8 @@ CREATE TABLE MAP_ELEMENT
344344
(
345345
MULTIPLE_COLLECTIONS BIGINT,
346346
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
347+
ENUM_MAP_OWNER BIGINT,
348+
ENUM_MAP_OWNER_KEY VARCHAR(10),
347349
NAME VARCHAR(100)
348350
);
349351

@@ -357,3 +359,9 @@ CREATE TABLE BOOK
357359
AUTHOR BIGINT,
358360
NAME VARCHAR(100)
359361
);
362+
363+
CREATE TABLE ENUM_MAP_OWNER
364+
(
365+
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
366+
NAME VARCHAR(100)
367+
);

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-oracle.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ DROP TABLE SET_ELEMENT CASCADE CONSTRAINTS PURGE;
4040
DROP TABLE BOOK CASCADE CONSTRAINTS PURGE;
4141
DROP TABLE AUTHOR CASCADE CONSTRAINTS PURGE;
4242

43+
DROP TABLE ENUM_MAP_OWNER CASCADE CONSTRAINTS PURGE;
44+
4345
CREATE TABLE LEGO_SET
4446
(
4547
"id1" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
@@ -387,6 +389,8 @@ CREATE TABLE MAP_ELEMENT
387389
(
388390
MULTIPLE_COLLECTIONS NUMBER,
389391
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
392+
ENUM_MAP_OWNER BIGINT,
393+
ENUM_MAP_OWNER_KEY VARCHAR(10),
390394
NAME VARCHAR(100)
391395
);
392396

@@ -400,3 +404,9 @@ CREATE TABLE BOOK
400404
AUTHOR NUMBER,
401405
NAME VARCHAR(100)
402406
);
407+
408+
CREATE TABLE ENUM_MAP_OWNER
409+
(
410+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
411+
NAME VARCHAR(100)
412+
);

spring-data-jdbc/src/test/resources/org.springframework.data.jdbc.core/JdbcAggregateTemplateIntegrationTests-postgres.sql

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ DROP TABLE SET_ELEMENT;
4343
DROP TABLE BOOK;
4444
DROP TABLE AUTHOR;
4545

46+
DROP TABLE ENUM_MAP_OWNER;
47+
4648
CREATE TABLE LEGO_SET
4749
(
4850
"id1" SERIAL PRIMARY KEY,
@@ -409,6 +411,8 @@ CREATE TABLE MAP_ELEMENT
409411
(
410412
MULTIPLE_COLLECTIONS BIGINT,
411413
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
414+
ENUM_MAP_OWNER BIGINT,
415+
ENUM_MAP_OWNER_KEY VARCHAR(10),
412416
NAME VARCHAR(100)
413417
);
414418

@@ -422,3 +426,9 @@ CREATE TABLE BOOK
422426
AUTHOR BIGINT,
423427
NAME VARCHAR(100)
424428
);
429+
430+
CREATE TABLE ENUM_MAP_OWNER
431+
(
432+
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
433+
NAME VARCHAR(100)
434+
);

0 commit comments

Comments
 (0)