diff --git a/hibernate-core/src/main/java/org/hibernate/type/internal/ParameterizedTypeImpl.java b/hibernate-core/src/main/java/org/hibernate/type/internal/ParameterizedTypeImpl.java index d30573c99031..b72de29aebcc 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/internal/ParameterizedTypeImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/type/internal/ParameterizedTypeImpl.java @@ -34,7 +34,13 @@ public static ParameterizedTypeImpl from(ParameterizedTypeDetails typeDetails) { final int argumentsSize = arguments.size(); final java.lang.reflect.Type[] argumentTypes = new java.lang.reflect.Type[argumentsSize]; for ( int i = 0; i < argumentsSize; i++ ) { - argumentTypes[i] = arguments.get( i ).determineRawClass().toJavaClass(); + TypeDetails argument = arguments.get( i ); + if ( argument.getTypeKind() == TypeDetails.Kind.PARAMETERIZED_TYPE ) { + argumentTypes[i] = from( argument.asParameterizedType() ); + } + else { + argumentTypes[i] = argument.determineRawClass().toJavaClass(); + } } final TypeVariableScope owner = typeDetails.asParameterizedType().getOwner(); final java.lang.reflect.Type ownerType; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/JsonMappingTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/JsonMappingTests.java index 1768903a2d34..de1a0f68a0ef 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/JsonMappingTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/mapping/basic/JsonMappingTests.java @@ -43,6 +43,7 @@ import java.sql.Clob; import java.util.List; import java.util.Map; +import java.util.Set; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.equalTo; @@ -80,6 +81,7 @@ public Jackson() { private final Map objectMap; private final List list; private final String json; + Map>>> complexMap; protected JsonMappingTests(boolean supportsObjectMapKey) { this.stringMap = Map.of( "name", "ABC" ); @@ -89,13 +91,14 @@ protected JsonMappingTests(boolean supportsObjectMapKey) { ) : null; this.list = List.of( new StringNode( "ABC" ) ); this.json = "{\"name\":\"abc\"}"; + this.complexMap = Map.of( "name", Map.of( "inner", List.of( Set.of( 10L ), Set.of( 20L ) ) ) ); } @BeforeEach public void setup(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - session.persist( new EntityWithJson( 1, stringMap, objectMap, list, json ) ); + session.persist( new EntityWithJson( 1, stringMap, objectMap, list, json, complexMap ) ); } ); } @@ -156,7 +159,7 @@ public void verifyReadWorks(SessionFactoryScope scope) { public void verifyMergeWorks(SessionFactoryScope scope) { scope.inTransaction( (session) -> { - session.merge( new EntityWithJson( 2, null, null, null, null ) ); + session.merge( new EntityWithJson( 2, null, null, null, null, null) ); } ); @@ -169,6 +172,7 @@ public void verifyMergeWorks(SessionFactoryScope scope) { assertThat( entityWithJson.jsonString, is( nullValue() ) ); assertThat( entityWithJson.jsonNode, is( nullValue() ) ); assertThat( entityWithJson.jsonValue, is( nullValue() ) ); + assertThat( entityWithJson.complexMap, is( nullValue() ) ); } ); } @@ -271,6 +275,7 @@ public void verifyCriteriaUpdateQueryWorks(SessionFactoryScope scope) { assertThat( entityWithJson.stringMap, is( newMap ) ); assertThat( entityWithJson.list, is( newList ) ); assertThat( entityWithJson.jsonString.replaceAll( "\\s", "" ), is( newJson ) ); + assertThat( entityWithJson.complexMap, is( complexMap ) ); } ); } @@ -300,6 +305,9 @@ public static class EntityWithJson { @JdbcTypeCode( SqlTypes.JSON ) private JsonValue jsonValue; + @JdbcTypeCode( SqlTypes.JSON ) + private Map>>> complexMap; + public EntityWithJson() { } @@ -308,12 +316,14 @@ public EntityWithJson( Map stringMap, Map objectMap, List list, - String jsonString) { + String jsonString, + Map>>> complexMap) { this.id = id; this.stringMap = stringMap; this.objectMap = objectMap; this.list = list; this.jsonString = jsonString; + this.complexMap = complexMap; } }