diff --git a/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java b/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java index bf10b5502..02a69e35c 100644 --- a/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java +++ b/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java @@ -32,6 +32,13 @@ public JsonBinaryType() { ); } + public JsonBinaryType(Type javaType) { + super( + JsonBinarySqlTypeDescriptor.INSTANCE, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonBinaryType(Configuration configuration) { super( JsonBinarySqlTypeDescriptor.INSTANCE, diff --git a/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java b/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java index 157ece32c..d185542e0 100644 --- a/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java +++ b/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java @@ -31,6 +31,13 @@ public JsonBlobType() { ); } + public JsonBlobType(Type javaType) { + super( + org.hibernate.type.descriptor.sql.BlobTypeDescriptor.DEFAULT, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonBlobType(Configuration configuration) { super( org.hibernate.type.descriptor.sql.BlobTypeDescriptor.DEFAULT, diff --git a/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java b/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java index 7a83535bf..3879e13fb 100644 --- a/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java +++ b/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java @@ -37,6 +37,13 @@ public JsonStringType() { ); } + public JsonStringType(Type javaType) { + super( + JsonStringSqlTypeDescriptor.INSTANCE, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonStringType(Configuration configuration) { super( JsonStringSqlTypeDescriptor.INSTANCE, diff --git a/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java b/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java index 498223302..7ac5a11f6 100644 --- a/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java +++ b/hibernate-types-43/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java @@ -44,6 +44,11 @@ protected Object deepCopyNotNull(Object value) { }); } + public JsonTypeDescriptor(Type type) { + this(); + this.type = type; + } + public JsonTypeDescriptor(final ObjectMapperWrapper objectMapperWrapper) { super(Object.class, new MutableMutabilityPlan() { @Override @@ -55,13 +60,7 @@ protected Object deepCopyNotNull(Object value) { } public JsonTypeDescriptor(final ObjectMapperWrapper objectMapperWrapper, Type type) { - super(Object.class, new MutableMutabilityPlan() { - @Override - protected Object deepCopyNotNull(Object value) { - return objectMapperWrapper.clone(value); - } - }); - this.objectMapperWrapper = objectMapperWrapper; + this(objectMapperWrapper); this.type = type; } diff --git a/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java b/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java index f3e2a8c2b..31d4faa90 100644 --- a/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java +++ b/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java @@ -1,8 +1,9 @@ package com.vladmihalcea.hibernate.type.json; +import com.fasterxml.jackson.databind.JsonNode; import com.vladmihalcea.hibernate.type.util.AbstractOracleIntegrationTest; import com.vladmihalcea.hibernate.type.util.transaction.JPATransactionFunction; -import org.hibernate.Session; +import org.hibernate.SQLQuery; import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; @@ -10,6 +11,7 @@ import javax.persistence.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -74,6 +76,27 @@ public Void apply(EntityManager entityManager) { return null; } }); + + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(SQLQuery.class) + .addScalar("properties", new JsonStringType(JsonNode.class)) + .uniqueResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + + return null; + } + }); } @Entity(name = "Book") diff --git a/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java b/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java new file mode 100644 index 000000000..56114c942 --- /dev/null +++ b/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java @@ -0,0 +1,133 @@ +package com.vladmihalcea.hibernate.type.json; + +import com.fasterxml.jackson.databind.JsonNode; +import com.vladmihalcea.hibernate.type.util.AbstractPostgreSQLIntegrationTest; +import com.vladmihalcea.hibernate.type.util.transaction.JPATransactionFunction; +import org.hibernate.SQLQuery; +import org.hibernate.Session; +import org.hibernate.annotations.NaturalId; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; +import org.junit.Test; + +import javax.persistence.*; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author Vlad Mihalcea + */ +public class PostgreSQLJsonStringPropertyTest extends AbstractPostgreSQLIntegrationTest { + + @Override + protected Class[] entities() { + return new Class[]{ + Book.class + }; + } + + @Test + public void test() { + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + entityManager.persist( + new Book() + .setIsbn("978-9730228236") + .setProperties( + "{" + + " \"title\": \"High-Performance Java Persistence\"," + + " \"author\": \"Vlad Mihalcea\"," + + " \"publisher\": \"Amazon\"," + + " \"price\": 44.99" + + "}" + ) + ); + + return null; + } + }); + + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + Book book = (Book) entityManager.unwrap(Session.class) + .bySimpleNaturalId(Book.class) + .load("978-9730228236"); + + LOGGER.info("Book details: {}", book.getProperties()); + + assertTrue(book.getProperties().contains("\"price\": 44.99")); + + book.setProperties( + "{" + + " \"title\": \"High-Performance Java Persistence\"," + + " \"author\": \"Vlad Mihalcea\"," + + " \"publisher\": \"Amazon\"," + + " \"price\": 44.99," + + " \"url\": \"https://www.amazon.com/High-Performance-Java-Persistence-Vlad-Mihalcea/dp/973022823X/\"" + + "}" + ); + + return null; + } + }); + + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(SQLQuery.class) + .addScalar("properties", new JsonBinaryType(JsonNode.class)) + .uniqueResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + + return null; + } + }); + } + + @Entity(name = "Book") + @Table(name = "book") + @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class) + public static class Book { + + @Id + @GeneratedValue + private Long id; + + @NaturalId + private String isbn; + + @Type(type = "jsonb") + @Column(columnDefinition = "jsonb") + private String properties; + + public String getIsbn() { + return isbn; + } + + public Book setIsbn(String isbn) { + this.isbn = isbn; + return this; + } + + public String getProperties() { + return properties; + } + + public Book setProperties(String properties) { + this.properties = properties; + return this; + } + } +} diff --git a/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java b/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java index abaf213b8..110d8d182 100644 --- a/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java +++ b/hibernate-types-43/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java @@ -1,7 +1,9 @@ package com.vladmihalcea.hibernate.type.json; +import com.fasterxml.jackson.databind.JsonNode; import com.vladmihalcea.hibernate.type.util.AbstractSQLServerIntegrationTest; import com.vladmihalcea.hibernate.type.util.transaction.JPATransactionFunction; +import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.Type; @@ -10,6 +12,7 @@ import javax.persistence.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -74,6 +77,27 @@ public Void apply(EntityManager entityManager) { return null; } }); + + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(SQLQuery.class) + .addScalar("properties", new JsonStringType(JsonNode.class)) + .uniqueResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + + return null; + } + }); } @Entity(name = "Book") diff --git a/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java b/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java index bf10b5502..02a69e35c 100644 --- a/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java +++ b/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java @@ -32,6 +32,13 @@ public JsonBinaryType() { ); } + public JsonBinaryType(Type javaType) { + super( + JsonBinarySqlTypeDescriptor.INSTANCE, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonBinaryType(Configuration configuration) { super( JsonBinarySqlTypeDescriptor.INSTANCE, diff --git a/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java b/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java index 157ece32c..d185542e0 100644 --- a/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java +++ b/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java @@ -31,6 +31,13 @@ public JsonBlobType() { ); } + public JsonBlobType(Type javaType) { + super( + org.hibernate.type.descriptor.sql.BlobTypeDescriptor.DEFAULT, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonBlobType(Configuration configuration) { super( org.hibernate.type.descriptor.sql.BlobTypeDescriptor.DEFAULT, diff --git a/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java b/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java index 7a83535bf..3879e13fb 100644 --- a/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java +++ b/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java @@ -37,6 +37,13 @@ public JsonStringType() { ); } + public JsonStringType(Type javaType) { + super( + JsonStringSqlTypeDescriptor.INSTANCE, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonStringType(Configuration configuration) { super( JsonStringSqlTypeDescriptor.INSTANCE, diff --git a/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java b/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java index 498223302..4f1969fdd 100644 --- a/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java +++ b/hibernate-types-5/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java @@ -44,6 +44,11 @@ protected Object deepCopyNotNull(Object value) { }); } + public JsonTypeDescriptor(Type type) { + this(); + this.type = type; + } + public JsonTypeDescriptor(final ObjectMapperWrapper objectMapperWrapper) { super(Object.class, new MutableMutabilityPlan() { @Override diff --git a/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java b/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java index 0d798944a..5d834469d 100644 --- a/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java +++ b/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java @@ -1,7 +1,9 @@ package com.vladmihalcea.hibernate.type.json; +import com.fasterxml.jackson.databind.JsonNode; import com.vladmihalcea.hibernate.type.util.AbstractOracleIntegrationTest; import com.vladmihalcea.hibernate.type.util.transaction.JPATransactionFunction; +import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.Type; @@ -10,6 +12,7 @@ import javax.persistence.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -70,6 +73,27 @@ public Void apply(EntityManager entityManager) { return null; } }); + + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(SQLQuery.class) + .addScalar("properties", new JsonStringType(JsonNode.class)) + .uniqueResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + + return null; + } + }); } @Entity(name = "Book") diff --git a/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java b/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java new file mode 100644 index 000000000..3ebdbb1ce --- /dev/null +++ b/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java @@ -0,0 +1,134 @@ +package com.vladmihalcea.hibernate.type.json; + +import com.fasterxml.jackson.databind.JsonNode; +import com.vladmihalcea.hibernate.type.util.AbstractPostgreSQLIntegrationTest; +import com.vladmihalcea.hibernate.type.util.AbstractSQLServerIntegrationTest; +import com.vladmihalcea.hibernate.type.util.transaction.JPATransactionFunction; +import org.hibernate.SQLQuery; +import org.hibernate.Session; +import org.hibernate.annotations.NaturalId; +import org.hibernate.annotations.Type; +import org.hibernate.annotations.TypeDef; +import org.junit.Test; + +import javax.persistence.*; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * @author Vlad Mihalcea + */ +public class PostgreSQLJsonStringPropertyTest extends AbstractPostgreSQLIntegrationTest { + + @Override + protected Class[] entities() { + return new Class[]{ + Book.class + }; + } + + @Test + public void test() { + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + entityManager.persist( + new Book() + .setIsbn("978-9730228236") + .setProperties( + "{" + + " \"title\": \"High-Performance Java Persistence\"," + + " \"author\": \"Vlad Mihalcea\"," + + " \"publisher\": \"Amazon\"," + + " \"price\": 44.99" + + "}" + ) + ); + + return null; + } + }); + + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + Book book = entityManager.unwrap(Session.class) + .bySimpleNaturalId(Book.class) + .load("978-9730228236"); + + LOGGER.info("Book details: {}", book.getProperties()); + + assertTrue(book.getProperties().contains("\"price\": 44.99")); + + book.setProperties( + "{" + + " \"title\": \"High-Performance Java Persistence\"," + + " \"author\": \"Vlad Mihalcea\"," + + " \"publisher\": \"Amazon\"," + + " \"price\": 44.99," + + " \"url\": \"https://www.amazon.com/High-Performance-Java-Persistence-Vlad-Mihalcea/dp/973022823X/\"" + + "}" + ); + + return null; + } + }); + + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(SQLQuery.class) + .addScalar("properties", new JsonBinaryType(JsonNode.class)) + .uniqueResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + + return null; + } + }); + } + + @Entity(name = "Book") + @Table(name = "book") + @TypeDef(name = "jsonb", typeClass = JsonBinaryType.class) + public static class Book { + + @Id + @GeneratedValue + private Long id; + + @NaturalId + private String isbn; + + @Type(type = "jsonb") + @Column(columnDefinition = "jsonb") + private String properties; + + public String getIsbn() { + return isbn; + } + + public Book setIsbn(String isbn) { + this.isbn = isbn; + return this; + } + + public String getProperties() { + return properties; + } + + public Book setProperties(String properties) { + this.properties = properties; + return this; + } + } +} diff --git a/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java b/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java index f54573a1f..0720ab14c 100644 --- a/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java +++ b/hibernate-types-5/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java @@ -1,7 +1,9 @@ package com.vladmihalcea.hibernate.type.json; +import com.fasterxml.jackson.databind.JsonNode; import com.vladmihalcea.hibernate.type.util.AbstractSQLServerIntegrationTest; import com.vladmihalcea.hibernate.type.util.transaction.JPATransactionFunction; +import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.Type; @@ -10,6 +12,7 @@ import javax.persistence.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -70,6 +73,27 @@ public Void apply(EntityManager entityManager) { return null; } }); + + doInJPA(new JPATransactionFunction() { + @Override + public Void apply(EntityManager entityManager) { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(SQLQuery.class) + .addScalar("properties", new JsonStringType(JsonNode.class)) + .uniqueResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + + return null; + } + }); } @Entity(name = "Book") diff --git a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java index bf10b5502..02a69e35c 100644 --- a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java +++ b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBinaryType.java @@ -32,6 +32,13 @@ public JsonBinaryType() { ); } + public JsonBinaryType(Type javaType) { + super( + JsonBinarySqlTypeDescriptor.INSTANCE, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonBinaryType(Configuration configuration) { super( JsonBinarySqlTypeDescriptor.INSTANCE, diff --git a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java index 157ece32c..d185542e0 100644 --- a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java +++ b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonBlobType.java @@ -31,6 +31,13 @@ public JsonBlobType() { ); } + public JsonBlobType(Type javaType) { + super( + org.hibernate.type.descriptor.sql.BlobTypeDescriptor.DEFAULT, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonBlobType(Configuration configuration) { super( org.hibernate.type.descriptor.sql.BlobTypeDescriptor.DEFAULT, diff --git a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java index 7a83535bf..3879e13fb 100644 --- a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java +++ b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/JsonStringType.java @@ -37,6 +37,13 @@ public JsonStringType() { ); } + public JsonStringType(Type javaType) { + super( + JsonStringSqlTypeDescriptor.INSTANCE, + new JsonTypeDescriptor(Configuration.INSTANCE.getObjectMapperWrapper(), javaType) + ); + } + public JsonStringType(Configuration configuration) { super( JsonStringSqlTypeDescriptor.INSTANCE, diff --git a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java index 81759a28b..57283850a 100644 --- a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java +++ b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/json/internal/JsonTypeDescriptor.java @@ -44,6 +44,11 @@ protected Object deepCopyNotNull(Object value) { }); } + public JsonTypeDescriptor(Type type) { + this(); + this.type = type; + } + public JsonTypeDescriptor(final ObjectMapperWrapper objectMapperWrapper) { super(Object.class, new MutableMutabilityPlan() { @Override @@ -55,13 +60,7 @@ protected Object deepCopyNotNull(Object value) { } public JsonTypeDescriptor(final ObjectMapperWrapper objectMapperWrapper, Type type) { - super(Object.class, new MutableMutabilityPlan() { - @Override - protected Object deepCopyNotNull(Object value) { - return objectMapperWrapper.clone(value); - } - }); - this.objectMapperWrapper = objectMapperWrapper; + this(objectMapperWrapper); this.type = type; } diff --git a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java index 506f64dbb..cbf514777 100644 --- a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java +++ b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/OracleJsonStringPropertyTest.java @@ -1,15 +1,18 @@ package com.vladmihalcea.hibernate.type.json; +import com.fasterxml.jackson.databind.JsonNode; import com.vladmihalcea.hibernate.type.util.AbstractOracleIntegrationTest; import com.vladmihalcea.hibernate.type.util.AbstractPostgreSQLIntegrationTest; import org.hibernate.Session; import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; +import org.hibernate.query.NativeQuery; import org.junit.Test; import javax.persistence.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -60,6 +63,22 @@ public void test() { "}" ); }); + + doInJPA(entityManager -> { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(NativeQuery.class) + .addScalar("properties", new JsonStringType(JsonNode.class)) + .getSingleResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + }); } @Entity(name = "Book") diff --git a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java index a95a650dc..ee115d729 100644 --- a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java +++ b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/PostgreSQLJsonStringPropertyTest.java @@ -1,14 +1,17 @@ package com.vladmihalcea.hibernate.type.json; +import com.fasterxml.jackson.databind.JsonNode; import com.vladmihalcea.hibernate.type.util.AbstractPostgreSQLIntegrationTest; import org.hibernate.Session; import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; +import org.hibernate.query.NativeQuery; import org.junit.Test; import javax.persistence.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -19,7 +22,7 @@ public class PostgreSQLJsonStringPropertyTest extends AbstractPostgreSQLIntegrat @Override protected Class[] entities() { return new Class[]{ - Book.class + Book.class }; } @@ -60,6 +63,22 @@ public void test() { "}" ); }); + + doInJPA(entityManager -> { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(NativeQuery.class) + .addScalar("properties", new JsonBinaryType(JsonNode.class)) + .getSingleResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + }); } @Entity(name = "Book") diff --git a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java index 5874d1a79..2e1115d4f 100644 --- a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java +++ b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/json/SQLServerJsonStringPropertyTest.java @@ -1,14 +1,17 @@ package com.vladmihalcea.hibernate.type.json; +import com.fasterxml.jackson.databind.JsonNode; import com.vladmihalcea.hibernate.type.util.AbstractSQLServerIntegrationTest; import org.hibernate.Session; import org.hibernate.annotations.NaturalId; import org.hibernate.annotations.Type; import org.hibernate.annotations.TypeDef; +import org.hibernate.query.NativeQuery; import org.junit.Test; import javax.persistence.*; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** @@ -59,6 +62,22 @@ public void test() { "}" ); }); + + doInJPA(entityManager -> { + JsonNode properties = (JsonNode) entityManager + .createNativeQuery( + "SELECT " + + " properties AS properties " + + "FROM book " + + "WHERE " + + " isbn = :isbn") + .setParameter("isbn", "978-9730228236") + .unwrap(NativeQuery.class) + .addScalar("properties", new JsonStringType(JsonNode.class)) + .getSingleResult(); + + assertEquals("High-Performance Java Persistence", properties.get("title").asText()); + }); } @Entity(name = "Book")