diff --git a/src/main/java/io/ebean/SqlUpdate.java b/src/main/java/io/ebean/SqlUpdate.java index 59865f815..87364334d 100644 --- a/src/main/java/io/ebean/SqlUpdate.java +++ b/src/main/java/io/ebean/SqlUpdate.java @@ -30,6 +30,35 @@ package io.ebean; * String msg = "There were " + modifiedCount + " rows updated"; * * } + *

+ *

Example: Using setNextParameter()

+ *
{@code
+ *
+ *  String sql = "insert into audit_log (id, description, modified_description) values (?,?,?)";
+ *  SqlUpdate insert = Ebean.createSqlUpdate(sql);
+ *
+ *  try (Transaction txn = Ebean.beginTransaction()) {
+ *    txn.setBatchMode(true);
+ *
+ *    insert.setNextParameter(10000);
+ *    insert.setNextParameter("hello");
+ *    insert.setNextParameter("rob");
+ *    insert.execute();
+ *
+ *    insert.setNextParameter(10001);
+ *    insert.setNextParameter("goodbye");
+ *    insert.setNextParameter("rob");
+ *    insert.execute();
+ *
+ *    insert.setNextParameter(10002);
+ *    insert.setNextParameter("chow");
+ *    insert.setNextParameter("bob");
+ *    insert.execute();
+ *
+ *    txn.commit();
+ *  }
+ *
+ * }
* * @see Update * @see SqlQuery @@ -61,7 +90,7 @@ public interface SqlUpdate { /** * Execute and return the generated key. This is effectively a short cut for: - * + *

*

{@code
    *
    *   sqlUpdate.execute();
@@ -137,6 +166,13 @@ public interface SqlUpdate {
    */
   SqlUpdate setTimeout(int secs);
 
+  /**
+   * Set the next positioned parameter.
+   *
+   * @param value The value to bind
+   */
+  SqlUpdate setNextParameter(Object value);
+
   /**
    * Set a parameter via its index position.
    */
diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java b/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
index c65b6c269..28869a8c3 100644
--- a/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
+++ b/src/main/java/io/ebeaninternal/server/core/DefaultSqlUpdate.java
@@ -105,6 +105,7 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
 
   @Override
   public int execute() {
+    addPos = 0;
     if (server != null) {
       return server.execute(this);
     } else {
@@ -182,8 +183,9 @@ public final class DefaultSqlUpdate implements Serializable, SpiSqlUpdate {
     return this;
   }
 
-  public void addParameter(Object value) {
+  public SqlUpdate setNextParameter(Object value) {
     setParameter(++addPos, value);
+    return this;
   }
 
   @Override
diff --git a/src/test/java/org/tests/persistencecontext/TestPersistenceContextQueryScope.java b/src/test/java/org/tests/persistencecontext/TestPersistenceContextQueryScope.java
index 367ec77ac..2221a7424 100644
--- a/src/test/java/org/tests/persistencecontext/TestPersistenceContextQueryScope.java
+++ b/src/test/java/org/tests/persistencecontext/TestPersistenceContextQueryScope.java
@@ -3,8 +3,8 @@ package org.tests.persistencecontext;
 import io.ebean.BaseTestCase;
 import io.ebean.Ebean;
 import io.ebean.SqlUpdate;
-import org.tests.model.basic.EBasicVer;
 import org.junit.Test;
+import org.tests.model.basic.EBasicVer;
 
 import static io.ebean.PersistenceContextScope.QUERY;
 import static io.ebean.PersistenceContextScope.TRANSACTION;
@@ -28,8 +28,8 @@ public class TestPersistenceContextQueryScope extends BaseTestCase {
 
       // do an update of the name in the DB
       SqlUpdate sqlUpdate = Ebean.createSqlUpdate("update e_basicver set name=? where id=?");
-      sqlUpdate.setParameter(1, "second");
-      sqlUpdate.setParameter(2, bean.getId());
+      sqlUpdate.setNextParameter("second");
+      sqlUpdate.setNextParameter(bean.getId());
       int rowCount = sqlUpdate.execute();
       assertEquals(1, rowCount);
 
diff --git a/src/test/java/org/tests/rawsql/TestInsertSqlLogging.java b/src/test/java/org/tests/rawsql/TestInsertSqlLogging.java
index 0d0c1824b..44e7ceef3 100644
--- a/src/test/java/org/tests/rawsql/TestInsertSqlLogging.java
+++ b/src/test/java/org/tests/rawsql/TestInsertSqlLogging.java
@@ -5,8 +5,8 @@ import io.ebean.Ebean;
 import io.ebean.SqlUpdate;
 import io.ebean.Transaction;
 import io.ebeaninternal.api.SpiTransaction;
-import org.tests.idkeys.db.AuditLog;
 import org.junit.Test;
+import org.tests.idkeys.db.AuditLog;
 
 import static org.junit.Assert.assertFalse;
 
@@ -15,15 +15,33 @@ public class TestInsertSqlLogging extends BaseTestCase {
   @Test
   public void test() {
 
-    Ebean.delete(AuditLog.class, 10000);
+    Ebean.find(AuditLog.class).where().ge("id", 10000).delete();
 
     String sql = "insert into audit_log (id, description, modified_description) values (?,?,?)";
-    SqlUpdate sqlUpdate = Ebean.createSqlUpdate(sql);
-    sqlUpdate.setParameter(1, 10000);
-    sqlUpdate.setParameter(2, "hello");
-    sqlUpdate.setParameter(3, "rob");
+    SqlUpdate insert = Ebean.createSqlUpdate(sql);
+
+    try (Transaction txn = Ebean.beginTransaction()) {
+      txn.setBatchMode(true);
+      txn.setBatchSize(2);
+
+      insert.setNextParameter(10000);
+      insert.setNextParameter("hello");
+      insert.setNextParameter("rob");
+      insert.execute();
+
+      insert.setNextParameter(10001);
+      insert.setNextParameter("goodbye");
+      insert.setNextParameter("rob");
+      insert.execute();
+
+      insert.setNextParameter(10002);
+      insert.setNextParameter("chow");
+      insert.setNextParameter("bob");
+      insert.execute();
+
+      txn.commit();
+    }
 
-    sqlUpdate.execute();
   }
 
   @Test