diff --git a/ebean-api/src/main/java/io/ebean/SqlQuery.java b/ebean-api/src/main/java/io/ebean/SqlQuery.java index 240d42aad..5ab123743 100644 --- a/ebean-api/src/main/java/io/ebean/SqlQuery.java +++ b/ebean-api/src/main/java/io/ebean/SqlQuery.java @@ -246,6 +246,16 @@ public interface SqlQuery extends Serializable, CancelableQuery { */ SqlQuery setParameter(Object value); + /** + * Set a null parameter by position. + */ + SqlQuery setNullParameter(int position, int jdbcType); + + /** + * Set a null parameter by name. + */ + SqlQuery setNullParameter(String name, int jdbcType); + /** * Bind the parameter by its index position (1 based like JDBC). *

diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java index ec3b6ed05..1c6d43719 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/BindParams.java @@ -167,7 +167,7 @@ public final class BindParams implements Serializable { */ @SuppressWarnings("rawtypes") public void setParameter(int position, Object value) { - assert value != null : "use setNullParameter"; + //TODO: Review - assert value != null : "use setNullParameter"; Param p = getParam(position); if (value instanceof Collection) { // use of postgres ANY with positioned parameter @@ -219,7 +219,7 @@ public final class BindParams implements Serializable { * Set a named In parameter that is not null. */ public Param setParameter(String name, Object value) { - assert value != null : "use setNullParameter"; + // TODO: Review - assert value != null : "use setNullParameter"; Param p = getParam(name); p.setInValue(value); return p; diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java index 69c8dbb7a..cc2594b8d 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java @@ -119,6 +119,18 @@ public final class DefaultRelationalQuery extends AbstractQuery implements SpiSq return this; } + @Override + public SqlQuery setNullParameter(int position, int jdbcType) { + bindParams.setNullParameter(position, jdbcType); + return this; + } + + @Override + public SqlQuery setNullParameter(String name, int jdbcType) { + bindParams.setNullParameter(name, jdbcType); + return this; + } + @Override public DefaultRelationalQuery setParameter(int position, Object value) { bindParams.setParameter(position, value); diff --git a/ebean-test/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java b/ebean-test/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java index fd3768090..99379e374 100644 --- a/ebean-test/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java +++ b/ebean-test/src/test/java/org/tests/query/sqlquery/SqlQueryTests.java @@ -13,6 +13,7 @@ import org.tests.model.basic.ResetBasicData; import java.math.BigDecimal; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Types; import java.time.OffsetDateTime; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; @@ -23,6 +24,54 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class SqlQueryTests extends BaseTestCase { + @ForPlatform(Platform.H2) + @Test + public void selectBindNull_byPos() { + String sql = "select nvl(cast(? as int), 42)"; + final Long val = DB.sqlQuery(sql) + .setNullParameter(1, Types.INTEGER) + .mapToScalar(Long.class) + .findOne(); + + assertThat(val).isEqualTo(42); + } + + @ForPlatform(Platform.H2) + @Test + public void selectBindNull_byName() { + String sql = "select nvl(cast(:val as int), 42)"; + final Long val = DB.sqlQuery(sql) + .setNullParameter("val", Types.INTEGER) + .mapToScalar(Long.class) + .findOne(); + + assertThat(val).isEqualTo(42); + } + + @ForPlatform(Platform.H2) + @Test + public void selectBindNull_usingSetParameter_ByPosition() { + String sql = "select nvl(cast(? as int), 42)"; + final Long val = DB.sqlQuery(sql) + .setParameter(1, null) + .mapToScalar(Long.class) + .findOne(); + + assertThat(val).isEqualTo(42); + } + + @ForPlatform(Platform.H2) + @Test + public void selectBindNull_usingSetParameter_byName() { + String sql = "select nvl(cast(:val as int), 42)"; + final Long val = DB.sqlQuery(sql) + .setParameter("val", null) + .mapToScalar(Long.class) + .findOne(); + + assertThat(val).isEqualTo(42); + } + @ForPlatform(Platform.H2) @Test public void selectFunction() {