From 61ffac2c77c1f20878893898ce7e19cb11c99db3 Mon Sep 17 00:00:00 2001 From: Marcos Lopez Gonzalez Date: Fri, 9 Nov 2018 20:54:10 +0100 Subject: [PATCH 1/6] jpa cast error --- .../baeldung/jpa/stringcast/DummyEntity.java | 44 ++++++++++++++ .../jpa/stringcast/QueryExecutor.java | 41 +++++++++++++ .../main/resources/META-INF/persistence.xml | 15 +++++ .../jpa/stringcast/SpringCastTest.java | 58 +++++++++++++++++++ .../src/test/resources/persistence.xml | 35 +++++++++++ 5 files changed, 193 insertions(+) create mode 100644 persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/DummyEntity.java create mode 100644 persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java create mode 100644 persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/DummyEntity.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/DummyEntity.java new file mode 100644 index 0000000000..12b57ff112 --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/DummyEntity.java @@ -0,0 +1,44 @@ +package com.baeldung.jpa.stringcast; + +import javax.persistence.*; + +@SqlResultSetMapping(name = "textQueryMapping", classes = { + @ConstructorResult(targetClass = DummyEntity.class, columns = { + @ColumnResult(name = "text") + }) +}) +@Entity +@Table(name = "dummy") +public class DummyEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String text; + + public DummyEntity() { + + } + + public DummyEntity(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + +} diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java new file mode 100644 index 0000000000..6f1e2ee5ca --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java @@ -0,0 +1,41 @@ +package com.baeldung.jpa.stringcast; + +import com.sun.istack.internal.Nullable; + +import javax.persistence.EntityManager; +import javax.persistence.Query; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class QueryExecutor { + + public static List executeNativeQueryNoCastCheck(String statement, EntityManager em) { + Query query = em.createNativeQuery(statement); + return query.getResultList(); + } + + public static List executeNativeQueryWithCastCheck(String statement, EntityManager em) { + Query query = em.createNativeQuery(statement); + List results = query.getResultList(); + + if (results.isEmpty()) { + return new ArrayList<>(); + } + + if (results.get(0) instanceof String) { + return ((List) results) + .stream() + .map(s -> new String[] { s }) + .collect(Collectors.toList()); + } else { + return (List) results; + } + } + + public static List executeNativeQueryGeneric(String statement, String mapping, EntityManager em) { + Query query = em.createNativeQuery(statement, mapping); + return query.getResultList(); + } + +} diff --git a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml index 3d881673b2..6345e7f364 100644 --- a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml @@ -20,6 +20,21 @@ + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.stringcast.DummyEntity + + + + + + + + + + + org.hibernate.jpa.HibernatePersistenceProvider diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java new file mode 100644 index 0000000000..f66bd5d4e4 --- /dev/null +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java @@ -0,0 +1,58 @@ +package com.baeldung.jpa.stringcast; + +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.EntityTransaction; +import javax.persistence.Persistence; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class SpringCastTest { + + private static EntityManager em; + private static EntityManagerFactory emFactory; + + @BeforeClass + public static void setup() { + emFactory = Persistence.createEntityManagerFactory("jpa-h2"); + em = emFactory.createEntityManager(); + + // insert an object into the db + DummyEntity dummyEntity = new DummyEntity(); + dummyEntity.setText("text"); + + EntityTransaction tr = em.getTransaction(); + tr.begin(); + em.persist(dummyEntity); + tr.commit(); + } + + @Test(expected = ClassCastException.class) + public void givenExecutorNoCastCheck_whenQueryReturnsOneColumn_thenClassCastThrown() { + List results = QueryExecutor.executeNativeQueryNoCastCheck("select text from dummy", em); + + // fails + for (String[] row : results) { + // do nothing + } + } + + @Test + public void givenExecutorWithCastCheck_whenQueryReturnsOneColumn_thenNoClassCastThrown() { + List results = QueryExecutor.executeNativeQueryWithCastCheck("select text from dummy", em); + assertEquals("text", results.get(0)[0]); + } + + @Test + public void givenExecutorGeneric_whenQueryReturnsOneColumn_thenNoClassCastThrown() { + List results = QueryExecutor.executeNativeQueryGeneric("select text from dummy", "textQueryMapping", em); + assertEquals("text", results + .get(0) + .getText()); + } + +} diff --git a/persistence-modules/java-jpa/src/test/resources/persistence.xml b/persistence-modules/java-jpa/src/test/resources/persistence.xml index d94221b54f..f65f2c7c62 100644 --- a/persistence-modules/java-jpa/src/test/resources/persistence.xml +++ b/persistence-modules/java-jpa/src/test/resources/persistence.xml @@ -17,5 +17,40 @@ + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.stringcast.DummyEntity + + + + + + + + + + + + + + + + com.baeldung.jpa.stringcast.DummyEntity + + + + + + + + + + + + + + + From 1d26380c072d4694fd8ac194befb1f7571bef858 Mon Sep 17 00:00:00 2001 From: Marcos Lopez Gonzalez Date: Fri, 9 Nov 2018 20:55:36 +0100 Subject: [PATCH 2/6] format --- .../test/java/com/baeldung/jpa/stringcast/SpringCastTest.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java index f66bd5d4e4..ffe8da9bec 100644 --- a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java @@ -50,9 +50,7 @@ public class SpringCastTest { @Test public void givenExecutorGeneric_whenQueryReturnsOneColumn_thenNoClassCastThrown() { List results = QueryExecutor.executeNativeQueryGeneric("select text from dummy", "textQueryMapping", em); - assertEquals("text", results - .get(0) - .getText()); + assertEquals("text", results.get(0).getText()); } } From f3e5bc6ee3139b10c5c4bed519ab8f1f4f574e2b Mon Sep 17 00:00:00 2001 From: Marcos Lopez Gonzalez Date: Sat, 10 Nov 2018 19:16:23 +0100 Subject: [PATCH 3/6] persistence unit name --- persistence-modules/java-jpa/src/test/resources/persistence.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/java-jpa/src/test/resources/persistence.xml b/persistence-modules/java-jpa/src/test/resources/persistence.xml index f65f2c7c62..8d744556cd 100644 --- a/persistence-modules/java-jpa/src/test/resources/persistence.xml +++ b/persistence-modules/java-jpa/src/test/resources/persistence.xml @@ -18,7 +18,7 @@ - + org.hibernate.jpa.HibernatePersistenceProvider com.baeldung.jpa.stringcast.DummyEntity From 917ab19240c749107de839382e5cfb41edc4de5c Mon Sep 17 00:00:00 2001 From: Marcos Lopez Gonzalez Date: Sat, 10 Nov 2018 19:17:23 +0100 Subject: [PATCH 4/6] code cleaning --- .../src/test/resources/persistence.xml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/persistence-modules/java-jpa/src/test/resources/persistence.xml b/persistence-modules/java-jpa/src/test/resources/persistence.xml index 8d744556cd..b6cc51c3b3 100644 --- a/persistence-modules/java-jpa/src/test/resources/persistence.xml +++ b/persistence-modules/java-jpa/src/test/resources/persistence.xml @@ -33,24 +33,5 @@ - - - - com.baeldung.jpa.stringcast.DummyEntity - - - - - - - - - - - - - - - From e7d145e4f9b6b8b1f0a656682d35ea7af63107fc Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 11 Nov 2018 09:28:06 +0200 Subject: [PATCH 5/6] Update and rename SpringCastTest.java to SpringCastTestUnit.java --- .../stringcast/{SpringCastTest.java => SpringCastTestUnit.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/{SpringCastTest.java => SpringCastTestUnit.java} (98%) diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTestUnit.java similarity index 98% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java rename to persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTestUnit.java index ffe8da9bec..d9c3adef26 100644 --- a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTest.java +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTestUnit.java @@ -11,7 +11,7 @@ import java.util.List; import static org.junit.Assert.assertEquals; -public class SpringCastTest { +public class SpringCastUnitTest { private static EntityManager em; private static EntityManagerFactory emFactory; From f7135b4a403b723017bbd4c4fafbccc182c380be Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 11 Nov 2018 09:34:07 +0200 Subject: [PATCH 6/6] Rename SpringCastTestUnit.java to SpringCastUnitTest.java --- .../{SpringCastTestUnit.java => SpringCastUnitTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/{SpringCastTestUnit.java => SpringCastUnitTest.java} (100%) diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTestUnit.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastUnitTest.java similarity index 100% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastTestUnit.java rename to persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/stringcast/SpringCastUnitTest.java