diff --git a/src/main/java/io/ebean/SqlQuery.java b/src/main/java/io/ebean/SqlQuery.java index d5a71f232..1c4e6e680 100644 --- a/src/main/java/io/ebean/SqlQuery.java +++ b/src/main/java/io/ebean/SqlQuery.java @@ -195,6 +195,31 @@ public interface SqlQuery extends Serializable { */ SqlQuery setParameter(String name, Object value); + /** + * Set one of more positioned parameters. + *

+ * This is a convenient alternative to multiple calls setParameter(). + * + *

{@code
+   *
+   *   String sql = "select id, name from customer where name like ? and status = ?";
+   *
+   *   Ebean.createSqlQuery(sql)
+   *       .setParams("Rob", Status.NEW)
+   *       .findList();
+   *
+   *
+   *   // is the same as ...
+   *
+   *   Ebean.createSqlQuery(sql)
+   *       .setParameter(1, "Rob")
+   *       .setParameter(2, "Status.NEW)
+   *       .findList();
+   *
+   * }
+ */ + SqlQuery setParams(Object... values); + /** * The same as bind for positioned parameters. */ diff --git a/src/main/java/io/ebean/SqlUpdate.java b/src/main/java/io/ebean/SqlUpdate.java index 27e7be39e..bd104c344 100644 --- a/src/main/java/io/ebean/SqlUpdate.java +++ b/src/main/java/io/ebean/SqlUpdate.java @@ -217,6 +217,33 @@ public interface SqlUpdate { */ SqlUpdate setTimeout(int secs); + /** + * Set one of more positioned parameters. + *

+ * This is a convenient alternative to multiple calls setParameter(). + * + *

{@code
+   *
+   *   String sql = "insert into audit_log (id, name, version) values (?,?,?)";
+   *
+   *   Ebean.createSqlUpdate(sql)
+   *       .setParams(UUID.randomUUID(), "Hello", 1)
+   *       .executeNow();
+   *
+   *
+   *   // is the same as ...
+   *
+   *   Ebean.createSqlUpdate(sql)
+   *       .setParameter(1, UUID.randomUUID())
+   *       .setParameter(2, "Hello")
+   *       .setParameter(3, 1)
+   *       .executeNow();
+   *
+   * }
+ * + */ + SqlUpdate setParams(Object... values); + /** * Set the next positioned parameter. * diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java b/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java index 9af2f2af4..7b028fa2b 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java @@ -239,6 +239,14 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate { return this; } + @Override + public SqlUpdate setParams(Object... values) { + for (Object value : values) { + setParameter(++addPos, value); + } + return this; + } + @Override public SqlUpdate setNextParameter(Object value) { setParameter(++addPos, value); diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java index db4948bcb..5dfcd4398 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultRelationalQuery.java @@ -34,6 +34,11 @@ public class DefaultRelationalQuery implements SpiSqlQuery { private int bufferFetchSizeHint; + /** + * Helper to add positioned parameters in order. + */ + private int addPos; + /** * Bind parameters when using the query language. */ @@ -107,6 +112,14 @@ public class DefaultRelationalQuery implements SpiSqlQuery { return Optional.ofNullable(findOne()); } + @Override + public DefaultRelationalQuery setParams(Object... values) { + for (Object value : values) { + setParameter(++addPos, value); + } + return this; + } + @Override public DefaultRelationalQuery setParameter(int position, Object value) { bindParams.setParameter(position, value); diff --git a/src/test/java/org/tests/update/TestSqlUpdateExceptions.java b/src/test/java/org/tests/update/TestSqlUpdateExceptions.java index 7296811f2..466b1154a 100644 --- a/src/test/java/org/tests/update/TestSqlUpdateExceptions.java +++ b/src/test/java/org/tests/update/TestSqlUpdateExceptions.java @@ -9,10 +9,28 @@ import org.junit.Test; import java.util.UUID; +import static org.assertj.core.api.Assertions.assertThat; + public class TestSqlUpdateExceptions extends BaseTestCase { private String sql = "insert into uuone (id, name, version) values (?,?,?)"; + @Test + public void simpleInsert() { + + UUID id = UUID.randomUUID(); + + Ebean.createSqlUpdate(sql) + .setParams(id, "hi", 1) + .executeNow(); + + UUID foundId = Ebean.createSqlQuery("select id from uuone where id = ?") + .setParams(id) + .findSingleAttribute(UUID.class); + + assertThat(foundId).isEqualTo(id); + } + @Test(expected = DuplicateKeyException.class) public void duplicateKey() {