From 73c5f29755bcd41ecb5324b67d89d36935c82c09 Mon Sep 17 00:00:00 2001 From: Ulrich Grave Date: Wed, 3 Aug 2022 08:19:21 +0200 Subject: [PATCH] Fix npe if money is null Closed gh-465 --- .../type/money/MonetaryAmountType.java | 8 ++--- .../money/MySQLMonetaryAmountTypeTest.java | 36 +++++++++++++++++++ .../PostgreSQLMonetaryAmountTypeTest.java | 36 +++++++++++++++++++ .../type/money/MonetaryAmountType.java | 8 ++--- .../money/MySQLMonetaryAmountTypeTest.java | 36 +++++++++++++++++++ .../PostgreSQLMonetaryAmountTypeTest.java | 36 +++++++++++++++++++ .../money/MySQLMonetaryAmountTypeTest.java | 36 +++++++++++++++++++ .../PostgreSQLMonetaryAmountTypeTest.java | 36 +++++++++++++++++++ 8 files changed, 224 insertions(+), 8 deletions(-) diff --git a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/money/MonetaryAmountType.java b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/money/MonetaryAmountType.java index ac0afb7b7..b5629e46a 100644 --- a/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/money/MonetaryAmountType.java +++ b/hibernate-types-52/src/main/java/com/vladmihalcea/hibernate/type/money/MonetaryAmountType.java @@ -75,14 +75,14 @@ public int hashCode(Object x) throws HibernateException { @Override public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { - if (rs.wasNull()) { - return null; - } - String amountColumnName = names[0]; String currencyColumnName = names[1]; BigDecimal amount = rs.getBigDecimal(amountColumnName); + if(amount == null) { + return null; + } + String currency = rs.getString(currencyColumnName); return Money.of(amount, currency); diff --git a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java index 34ce9c1ce..f41c59fc5 100644 --- a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java +++ b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java @@ -12,6 +12,7 @@ import java.math.BigDecimal; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * @author Piotr Olaszewski @@ -64,6 +65,31 @@ public void testSearchByMoney() { }); } + @Test + public void testReturnNullMoney() { + long _id = doInJPA(entityManager -> { + Salary salary = new Salary(); + entityManager.persist(salary); + return salary.getId(); + }); + + doInJPA(entityManager -> { + Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(salary.getSalary()); + }); + + doInJPA(entityManager -> { + MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(money); + }); + } + @Entity(name = "Salary") @Table(name = "salary") @TypeDef(name = "monetary-amount-currency", typeClass = MonetaryAmountType.class, defaultForType = MonetaryAmount.class) @@ -72,6 +98,8 @@ public static class Salary { @GeneratedValue private Long id; + private String other; + @Columns(columns = { @Column(name = "salary_amount"), @Column(name = "salary_currency") @@ -94,5 +122,13 @@ public MonetaryAmount getSalary() { public void setSalary(MonetaryAmount salary) { this.salary = salary; } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } } } diff --git a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java index c537e68b5..3b0f61323 100644 --- a/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java +++ b/hibernate-types-52/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java @@ -12,6 +12,7 @@ import java.math.BigDecimal; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * @author Piotr Olaszewski @@ -64,6 +65,31 @@ public void testSearchByMoney() { }); } + @Test + public void testReturnNullMoney() { + long _id = doInJPA(entityManager -> { + Salary salary = new Salary(); + entityManager.persist(salary); + return salary.getId(); + }); + + doInJPA(entityManager -> { + Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(salary.getSalary()); + }); + + doInJPA(entityManager -> { + MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(money); + }); + } + @Entity(name = "Salary") @Table(name = "salary") @TypeDef(name = "monetary-amount-currency", typeClass = MonetaryAmountType.class, defaultForType = MonetaryAmount.class) @@ -72,6 +98,8 @@ public static class Salary { @GeneratedValue private Long id; + private String other; + @Columns(columns = { @Column(name = "salary_amount"), @Column(name = "salary_currency") @@ -94,5 +122,13 @@ public MonetaryAmount getSalary() { public void setSalary(MonetaryAmount salary) { this.salary = salary; } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } } } diff --git a/hibernate-types-55/src/main/java/com/vladmihalcea/hibernate/type/money/MonetaryAmountType.java b/hibernate-types-55/src/main/java/com/vladmihalcea/hibernate/type/money/MonetaryAmountType.java index ac0afb7b7..b5629e46a 100644 --- a/hibernate-types-55/src/main/java/com/vladmihalcea/hibernate/type/money/MonetaryAmountType.java +++ b/hibernate-types-55/src/main/java/com/vladmihalcea/hibernate/type/money/MonetaryAmountType.java @@ -75,14 +75,14 @@ public int hashCode(Object x) throws HibernateException { @Override public Object nullSafeGet(ResultSet rs, String[] names, SharedSessionContractImplementor session, Object owner) throws HibernateException, SQLException { - if (rs.wasNull()) { - return null; - } - String amountColumnName = names[0]; String currencyColumnName = names[1]; BigDecimal amount = rs.getBigDecimal(amountColumnName); + if(amount == null) { + return null; + } + String currency = rs.getString(currencyColumnName); return Money.of(amount, currency); diff --git a/hibernate-types-55/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java b/hibernate-types-55/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java index 34ce9c1ce..f41c59fc5 100644 --- a/hibernate-types-55/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java +++ b/hibernate-types-55/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java @@ -12,6 +12,7 @@ import java.math.BigDecimal; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * @author Piotr Olaszewski @@ -64,6 +65,31 @@ public void testSearchByMoney() { }); } + @Test + public void testReturnNullMoney() { + long _id = doInJPA(entityManager -> { + Salary salary = new Salary(); + entityManager.persist(salary); + return salary.getId(); + }); + + doInJPA(entityManager -> { + Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(salary.getSalary()); + }); + + doInJPA(entityManager -> { + MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(money); + }); + } + @Entity(name = "Salary") @Table(name = "salary") @TypeDef(name = "monetary-amount-currency", typeClass = MonetaryAmountType.class, defaultForType = MonetaryAmount.class) @@ -72,6 +98,8 @@ public static class Salary { @GeneratedValue private Long id; + private String other; + @Columns(columns = { @Column(name = "salary_amount"), @Column(name = "salary_currency") @@ -94,5 +122,13 @@ public MonetaryAmount getSalary() { public void setSalary(MonetaryAmount salary) { this.salary = salary; } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } } } diff --git a/hibernate-types-55/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java b/hibernate-types-55/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java index c537e68b5..3b0f61323 100644 --- a/hibernate-types-55/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java +++ b/hibernate-types-55/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java @@ -12,6 +12,7 @@ import java.math.BigDecimal; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * @author Piotr Olaszewski @@ -64,6 +65,31 @@ public void testSearchByMoney() { }); } + @Test + public void testReturnNullMoney() { + long _id = doInJPA(entityManager -> { + Salary salary = new Salary(); + entityManager.persist(salary); + return salary.getId(); + }); + + doInJPA(entityManager -> { + Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(salary.getSalary()); + }); + + doInJPA(entityManager -> { + MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(money); + }); + } + @Entity(name = "Salary") @Table(name = "salary") @TypeDef(name = "monetary-amount-currency", typeClass = MonetaryAmountType.class, defaultForType = MonetaryAmount.class) @@ -72,6 +98,8 @@ public static class Salary { @GeneratedValue private Long id; + private String other; + @Columns(columns = { @Column(name = "salary_amount"), @Column(name = "salary_currency") @@ -94,5 +122,13 @@ public MonetaryAmount getSalary() { public void setSalary(MonetaryAmount salary) { this.salary = salary; } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } } } diff --git a/hibernate-types-60/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java b/hibernate-types-60/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java index 7da4bd3a0..23eb0d1e6 100644 --- a/hibernate-types-60/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java +++ b/hibernate-types-60/src/test/java/com/vladmihalcea/hibernate/type/money/MySQLMonetaryAmountTypeTest.java @@ -10,6 +10,7 @@ import java.math.BigDecimal; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * @author Piotr Olaszewski @@ -62,6 +63,31 @@ public void testSearchByMoney() { }); } + @Test + public void testReturnNullMoney() { + long _id = doInJPA(entityManager -> { + Salary salary = new Salary(); + entityManager.persist(salary); + return salary.getId(); + }); + + doInJPA(entityManager -> { + Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(salary.getSalary()); + }); + + doInJPA(entityManager -> { + MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(money); + }); + } + @Entity(name = "Salary") @Table(name = "salary") public static class Salary { @@ -69,6 +95,8 @@ public static class Salary { @GeneratedValue private Long id; + private String other; + @AttributeOverride(name = "amount", column = @Column(name = "salary_amount")) @AttributeOverride(name = "currency", column = @Column(name = "salary_currency")) @CompositeType(MonetaryAmountType.class) @@ -89,5 +117,13 @@ public MonetaryAmount getSalary() { public void setSalary(MonetaryAmount salary) { this.salary = salary; } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } } } diff --git a/hibernate-types-60/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java b/hibernate-types-60/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java index 7778c7794..da09d992c 100644 --- a/hibernate-types-60/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java +++ b/hibernate-types-60/src/test/java/com/vladmihalcea/hibernate/type/money/PostgreSQLMonetaryAmountTypeTest.java @@ -10,6 +10,7 @@ import java.math.BigDecimal; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; /** * @author Piotr Olaszewski @@ -62,6 +63,31 @@ public void testSearchByMoney() { }); } + @Test + public void testReturnNullMoney() { + long _id = doInJPA(entityManager -> { + Salary salary = new Salary(); + entityManager.persist(salary); + return salary.getId(); + }); + + doInJPA(entityManager -> { + Salary salary = entityManager.createQuery("select s from Salary s where s.id = :id", Salary.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(salary.getSalary()); + }); + + doInJPA(entityManager -> { + MonetaryAmount money = entityManager.createQuery("select s.salary from Salary s where s.id = :id", MonetaryAmount.class) + .setParameter("id", _id) + .getSingleResult(); + + assertNull(money); + }); + } + @Entity(name = "Salary") @Table(name = "salary") public static class Salary { @@ -69,6 +95,8 @@ public static class Salary { @GeneratedValue private Long id; + private String other; + @AttributeOverride(name = "amount", column = @Column(name = "salary_amount")) @AttributeOverride(name = "currency", column = @Column(name = "salary_currency")) @CompositeType(MonetaryAmountType.class) @@ -89,5 +117,13 @@ public MonetaryAmount getSalary() { public void setSalary(MonetaryAmount salary) { this.salary = salary; } + + public String getOther() { + return other; + } + + public void setOther(String other) { + this.other = other; + } } }