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
This commit is contained in:
committed by
Mark Paluch
parent
9238f3923d
commit
b063663d24
@@ -245,7 +245,7 @@ class JdbcAggregateChangeExecutionContext {
|
||||
RelationalPersistentEntity<?> persistentEntity = getRequiredPersistentEntity(idOwningAction.getEntityType());
|
||||
Object identifier = persistentEntity.getIdentifierAccessor(idOwningAction.getEntity()).getIdentifier();
|
||||
|
||||
Assert.state(identifier != null, "Couldn't obtain a required id value");
|
||||
Assert.state(identifier != null,() -> "Couldn't obtain a required id value for " + persistentEntity);
|
||||
|
||||
return identifier;
|
||||
}
|
||||
|
||||
@@ -23,7 +23,9 @@ import java.util.Map;
|
||||
import org.springframework.data.relational.core.mapping.PersistentPropertyPathExtension;
|
||||
import org.springframework.data.relational.core.sql.IdentifierProcessing;
|
||||
import org.springframework.data.relational.core.sql.SqlIdentifier;
|
||||
import org.springframework.data.util.TypeInformation;
|
||||
import org.springframework.jdbc.core.RowMapper;
|
||||
import org.springframework.jdbc.support.JdbcUtils;
|
||||
|
||||
/**
|
||||
* A {@link RowMapper} that maps a row to a {@link Map.Entry} so an {@link Iterable} of those can be converted to a
|
||||
@@ -50,8 +52,11 @@ class MapEntityRowMapper<T> implements RowMapper<Map.Entry<Object, T>> {
|
||||
@Override
|
||||
public Map.Entry<Object, T> mapRow(ResultSet rs, int rowNum) throws SQLException {
|
||||
|
||||
Object key = rs.getObject(keyColumn.getReference());
|
||||
return new HashMap.SimpleEntry<>(key, mapEntity(rs, key));
|
||||
Object key = new ResultSetAccessor(rs).getObject(keyColumn.getReference());
|
||||
Class<?> qualifierColumnType = path.getRequiredPersistentPropertyPath().getLeafProperty().getQualifierColumnType();
|
||||
Object convertedKey = converter.readValue(key, TypeInformation.of(qualifierColumnType));
|
||||
|
||||
return new HashMap.SimpleEntry<>(convertedKey, mapEntity(rs, key));
|
||||
}
|
||||
|
||||
private T mapEntity(ResultSet resultSet, Object key) {
|
||||
|
||||
@@ -1095,6 +1095,16 @@ class JdbcAggregateTemplateIntegrationTests {
|
||||
assertThat(template.findById(entity.id, EnumArrayOwner.class).digits).isEqualTo(new Color[]{Color.BLUE});
|
||||
}
|
||||
|
||||
@Test // GH-1656
|
||||
void mapWithEnumKey() {
|
||||
|
||||
EnumMapOwner enumMapOwner = template.save(new EnumMapOwner(null, "OwnerName", Map.of(Color.BLUE, new MapElement("Element"))));
|
||||
|
||||
Iterable<EnumMapOwner> enumMapOwners = template.findAll(EnumMapOwner.class);
|
||||
|
||||
assertThat(enumMapOwners).containsExactly(enumMapOwner);
|
||||
}
|
||||
|
||||
private <T extends Number> void saveAndUpdateAggregateWithVersion(VersionedAggregate aggregate,
|
||||
Function<Number, T> toConcreteNumber) {
|
||||
saveAndUpdateAggregateWithVersion(aggregate, toConcreteNumber, 0);
|
||||
@@ -1548,6 +1558,12 @@ class JdbcAggregateTemplateIntegrationTests {
|
||||
String insertOnly;
|
||||
}
|
||||
|
||||
record EnumMapOwner(@Id Long id, String name, Map<Color, MapElement> map) {
|
||||
}
|
||||
|
||||
record MapElement(String name) {
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@Import(TestConfiguration.class)
|
||||
static class Config {
|
||||
|
||||
@@ -41,14 +41,17 @@ DROP TABLE WITH_ID_ONLY;
|
||||
|
||||
DROP TABLE WITH_INSERT_ONLY;
|
||||
|
||||
DROP TABLE MAP_ELEMENT;
|
||||
DROP TABLE ENUM_MAP_OWNER;
|
||||
|
||||
CREATE TABLE LEGO_SET
|
||||
(
|
||||
"id1" BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
NAME VARCHAR(30)
|
||||
"id1" BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
NAME VARCHAR(30)
|
||||
);
|
||||
CREATE TABLE MANUAL
|
||||
(
|
||||
"id2" BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
"id2" BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
LEGO_SET BIGINT,
|
||||
"alternative" BIGINT,
|
||||
CONTENT VARCHAR(2000)
|
||||
@@ -358,11 +361,26 @@ CREATE TABLE WITH_LOCAL_DATE_TIME
|
||||
|
||||
CREATE TABLE WITH_ID_ONLY
|
||||
(
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY
|
||||
);
|
||||
|
||||
CREATE TABLE WITH_INSERT_ONLY
|
||||
(
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE MAP_ELEMENT
|
||||
(
|
||||
MULTIPLE_COLLECTIONS BIGINT,
|
||||
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
|
||||
ENUM_MAP_OWNER BIGINT,
|
||||
ENUM_MAP_OWNER_KEY VARCHAR(10),
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE ENUM_MAP_OWNER
|
||||
(
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
@@ -330,6 +330,21 @@ CREATE TABLE WITH_ID_ONLY
|
||||
|
||||
CREATE TABLE WITH_INSERT_ONLY
|
||||
(
|
||||
ID SERIAL PRIMARY KEY,
|
||||
ID SERIAL PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
);
|
||||
|
||||
CREATE TABLE MAP_ELEMENT
|
||||
(
|
||||
MULTIPLE_COLLECTIONS BIGINT,
|
||||
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
|
||||
ENUM_MAP_OWNER BIGINT,
|
||||
ENUM_MAP_OWNER_KEY VARCHAR(10),
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE ENUM_MAP_OWNER
|
||||
(
|
||||
ID SERIAL PRIMARY KEY,
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
@@ -327,11 +327,26 @@ CREATE TABLE WITH_LOCAL_DATE_TIME
|
||||
|
||||
CREATE TABLE WITH_INSERT_ONLY
|
||||
(
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE WITH_ID_ONLY
|
||||
(
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY
|
||||
)
|
||||
);
|
||||
|
||||
CREATE TABLE MAP_ELEMENT
|
||||
(
|
||||
MULTIPLE_COLLECTIONS BIGINT,
|
||||
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
|
||||
ENUM_MAP_OWNER BIGINT,
|
||||
ENUM_MAP_OWNER_KEY VARCHAR(10),
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE ENUM_MAP_OWNER
|
||||
(
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
@@ -300,11 +300,26 @@ CREATE TABLE WITH_LOCAL_DATE_TIME
|
||||
|
||||
CREATE TABLE WITH_ID_ONLY
|
||||
(
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY
|
||||
);
|
||||
|
||||
CREATE TABLE WITH_INSERT_ONLY
|
||||
(
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE MAP_ELEMENT
|
||||
(
|
||||
MULTIPLE_COLLECTIONS BIGINT,
|
||||
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
|
||||
ENUM_MAP_OWNER BIGINT,
|
||||
ENUM_MAP_OWNER_KEY VARCHAR(10),
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE ENUM_MAP_OWNER
|
||||
(
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
@@ -337,6 +337,23 @@ DROP TABLE IF EXISTS WITH_INSERT_ONLY;
|
||||
|
||||
CREATE TABLE WITH_INSERT_ONLY
|
||||
(
|
||||
ID BIGINT IDENTITY PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
ID BIGINT IDENTITY PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
|
||||
DROP TABLE MAP_ELEMENT;
|
||||
CREATE TABLE MAP_ELEMENT
|
||||
(
|
||||
MULTIPLE_COLLECTIONS BIGINT,
|
||||
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
|
||||
ENUM_MAP_OWNER BIGINT,
|
||||
ENUM_MAP_OWNER_KEY VARCHAR(10),
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
DROP TABLE ENUM_MAP_OWNER;
|
||||
CREATE TABLE ENUM_MAP_OWNER
|
||||
(
|
||||
ID BIGINT IDENTITY PRIMARY KEY,
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
@@ -305,11 +305,26 @@ CREATE TABLE WITH_LOCAL_DATE_TIME
|
||||
|
||||
CREATE TABLE WITH_ID_ONLY
|
||||
(
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY
|
||||
);
|
||||
|
||||
CREATE TABLE WITH_INSERT_ONLY
|
||||
(
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE MAP_ELEMENT
|
||||
(
|
||||
MULTIPLE_COLLECTIONS BIGINT,
|
||||
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
|
||||
ENUM_MAP_OWNER BIGINT,
|
||||
ENUM_MAP_OWNER_KEY VARCHAR(10),
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE ENUM_MAP_OWNER
|
||||
(
|
||||
ID BIGINT AUTO_INCREMENT PRIMARY KEY,
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
@@ -31,14 +31,17 @@ DROP TABLE WITH_LOCAL_DATE_TIME CASCADE CONSTRAINTS PURGE;
|
||||
DROP TABLE WITH_ID_ONLY CASCADE CONSTRAINTS PURGE;
|
||||
DROP TABLE WITH_INSERT_ONLY CASCADE CONSTRAINTS PURGE;
|
||||
|
||||
DROP TABLE MAP_ELEMENT CASCADE CONSTRAINTS PURGE;
|
||||
DROP TABLE ENUM_MAP_OWNER CASCADE CONSTRAINTS PURGE;
|
||||
|
||||
CREATE TABLE LEGO_SET
|
||||
(
|
||||
"id1" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
|
||||
NAME VARCHAR(30)
|
||||
NAME VARCHAR(30)
|
||||
);
|
||||
CREATE TABLE MANUAL
|
||||
(
|
||||
"id2" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
|
||||
"id2" NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
|
||||
LEGO_SET NUMBER,
|
||||
ALTERNATIVE NUMBER,
|
||||
CONTENT VARCHAR(2000)
|
||||
@@ -338,12 +341,27 @@ CREATE TABLE WITH_LOCAL_DATE_TIME
|
||||
|
||||
CREATE TABLE WITH_ID_ONLY
|
||||
(
|
||||
ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY
|
||||
ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE WITH_INSERT_ONLY
|
||||
(
|
||||
ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
ID NUMBER GENERATED by default on null as IDENTITY PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE MAP_ELEMENT
|
||||
(
|
||||
MULTIPLE_COLLECTIONS NUMBER,
|
||||
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
|
||||
ENUM_MAP_OWNER BIGINT,
|
||||
ENUM_MAP_OWNER_KEY VARCHAR(10),
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE ENUM_MAP_OWNER
|
||||
(
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
@@ -15,6 +15,9 @@ DROP TABLE WITH_READ_ONLY;
|
||||
DROP TABLE WITH_ID_ONLY;
|
||||
DROP TABLE WITH_INSERT_ONLY;
|
||||
|
||||
DROP TABLE MAP_ELEMENT;
|
||||
DROP TABLE ENUM_MAP_OWNER;
|
||||
|
||||
CREATE TABLE LEGO_SET
|
||||
(
|
||||
"id1" SERIAL PRIMARY KEY,
|
||||
@@ -346,6 +349,21 @@ CREATE TABLE WITH_ID_ONLY
|
||||
|
||||
CREATE TABLE WITH_INSERT_ONLY
|
||||
(
|
||||
ID SERIAL PRIMARY KEY,
|
||||
ID SERIAL PRIMARY KEY,
|
||||
INSERT_ONLY VARCHAR(100)
|
||||
);
|
||||
);
|
||||
|
||||
CREATE TABLE MAP_ELEMENT
|
||||
(
|
||||
MULTIPLE_COLLECTIONS BIGINT,
|
||||
MULTIPLE_COLLECTIONS_KEY VARCHAR(10),
|
||||
ENUM_MAP_OWNER BIGINT,
|
||||
ENUM_MAP_OWNER_KEY VARCHAR(10),
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
CREATE TABLE ENUM_MAP_OWNER
|
||||
(
|
||||
ID BIGINT GENERATED BY DEFAULT AS IDENTITY (START WITH 1) PRIMARY KEY,
|
||||
NAME VARCHAR(100)
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user