diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java index 606d51b40..a8a31d8d6 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java @@ -73,6 +73,12 @@ public abstract class AbstractSqlQueryRequest { } } + protected void flushJdbcBatchOnQuery() { + if (trans.isFlushOnQuery()) { + trans.flush(); + } + } + public EbeanServer getServer() { return server; } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java index 24746bf2a..7f581ebc1 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java @@ -88,14 +88,17 @@ public final class DtoQueryRequest extends AbstractSqlQueryRequest { } public void findEach(Consumer consumer) { + flushJdbcBatchOnQuery(); queryEngine.findEach(this, consumer); } public void findEachWhile(Predicate consumer) { + flushJdbcBatchOnQuery(); queryEngine.findEachWhile(this, consumer); } public List findList() { + flushJdbcBatchOnQuery(); return queryEngine.findList(this); } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java index a693cf15f..54f42ec87 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java @@ -56,35 +56,43 @@ public final class RelationalQueryRequest extends AbstractSqlQueryRequest { } boolean findEachRow(RowConsumer mapper) { + flushJdbcBatchOnQuery(); queryEngine.findEachRow(this, mapper); return true; } List findListMapper(RowMapper mapper) { + flushJdbcBatchOnQuery(); return queryEngine.findListMapper(this, mapper); } T findOneMapper(RowMapper mapper) { + flushJdbcBatchOnQuery(); return queryEngine.findOneMapper(this, mapper); } public List findSingleAttributeList(Class cls) { + flushJdbcBatchOnQuery(); return queryEngine.findSingleAttributeList(this, cls); } public T findSingleAttribute(Class cls) { + flushJdbcBatchOnQuery(); return queryEngine.findSingleAttribute(this, cls); } public void findEach(Consumer consumer) { + flushJdbcBatchOnQuery(); queryEngine.findEach(this, consumer); } public void findEachWhile(Predicate consumer) { + flushJdbcBatchOnQuery(); queryEngine.findEach(this, consumer); } public List findList() { + flushJdbcBatchOnQuery(); return queryEngine.findList(this); } diff --git a/ebean-core/src/test/java/org/tests/batchinsert/TestBatchInsertFlush.java b/ebean-core/src/test/java/org/tests/batchinsert/TestBatchInsertFlush.java index dc04e0b79..6e956510a 100644 --- a/ebean-core/src/test/java/org/tests/batchinsert/TestBatchInsertFlush.java +++ b/ebean-core/src/test/java/org/tests/batchinsert/TestBatchInsertFlush.java @@ -1,6 +1,8 @@ package org.tests.batchinsert; import io.ebean.BaseTestCase; +import io.ebean.DB; +import io.ebean.DtoQuery2Test; import io.ebean.Ebean; import io.ebean.EbeanServer; import io.ebean.Transaction; @@ -105,6 +107,41 @@ public class TestBatchInsertFlush extends BaseTestCase { assertSql(sql.get(0)).contains("select count(*)"); } + @Test + @Transactional(batchSize = 20) + public void transactional_flushOnSqlQuery() { + + LoggedSqlCollector.start(); + + DB.save(new EBasicVer("b1")); + DB.save(new EBasicVer("b2")); + + // trigger JDBC batch by default + DB.sqlQuery("select count(*) from e_basicver") + .mapToScalar(Integer.class) + .findOne(); + + List sql = LoggedSqlCollector.stop(); + assertSql(sql.get(0)).contains("insert into e_basicver"); + } + + @Test + @Transactional(batchSize = 20) + public void transactional_flushOnDtoQuery() { + + LoggedSqlCollector.start(); + + DB.save(new EBasicVer("b1")); + DB.save(new EBasicVer("b2")); + + // trigger JDBC batch by default + DB.findDto(DtoQuery2Test.DCust.class, "select id, name from o_customer") + .findList(); + + List sql = LoggedSqlCollector.stop(); + assertSql(sql.get(0)).contains("insert into e_basicver"); + } + @Test @Transactional(batch = PersistBatch.ALL) public void transactional_flushOnQuery() {