From 4ed3a18b9d7e9546547b59ba39662ea70d2cd48a Mon Sep 17 00:00:00 2001 From: rob bygrave Date: Fri, 7 Feb 2020 12:42:10 +1300 Subject: [PATCH] #1933 - ENH: Add DtoQuery.usingTransaction(Transaction) ... dto query with supplied transaction --- src/main/java/io/ebean/DtoQuery.java | 4 ++++ .../io/ebeaninternal/api/SpiDtoQuery.java | 6 ++++++ .../server/core/DtoQueryRequest.java | 2 +- .../server/querydefn/DefaultDtoQuery.java | 14 +++++++++++++ .../tests/basic/TestQueryUsingConnection.java | 20 +++++++++++++++++++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/ebean/DtoQuery.java b/src/main/java/io/ebean/DtoQuery.java index 61f7f3d86..6944e482a 100644 --- a/src/main/java/io/ebean/DtoQuery.java +++ b/src/main/java/io/ebean/DtoQuery.java @@ -136,4 +136,8 @@ public interface DtoQuery { */ DtoQuery setBufferFetchSizeHint(int bufferFetchSizeHint); + /** + * Use the explicit transaction to execute the query. + */ + DtoQuery usingTransaction(Transaction transaction); } diff --git a/src/main/java/io/ebeaninternal/api/SpiDtoQuery.java b/src/main/java/io/ebeaninternal/api/SpiDtoQuery.java index dba0169a2..16cee411c 100644 --- a/src/main/java/io/ebeaninternal/api/SpiDtoQuery.java +++ b/src/main/java/io/ebeaninternal/api/SpiDtoQuery.java @@ -2,6 +2,7 @@ package io.ebeaninternal.api; import io.ebean.DtoQuery; import io.ebean.ProfileLocation; +import io.ebean.Transaction; import io.ebeaninternal.server.dto.DtoMappingRequest; import io.ebeaninternal.server.dto.DtoQueryPlan; @@ -65,4 +66,9 @@ public interface SpiDtoQuery extends DtoQuery, SpiSqlBinding { */ SpiQuery getOrmQuery(); + /** + * Return the explicit transaction used to execute the query. + */ + Transaction getTransaction(); + } diff --git a/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java index 065fd342d..22a59e2f5 100644 --- a/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java @@ -32,7 +32,7 @@ public final class DtoQueryRequest extends AbstractSqlQueryRequest { private DataReader dataReader; DtoQueryRequest(SpiEbeanServer server, DtoQueryEngine engine, SpiDtoQuery query) { - super(server, query, null); + super(server, query, query.getTransaction()); this.queryEngine = engine; this.query = query; query.obtainLocation(); diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java index 6433f83fb..8607909ad 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.querydefn; import io.ebean.DtoQuery; import io.ebean.ProfileLocation; +import io.ebean.Transaction; import io.ebeaninternal.api.BindParams; import io.ebeaninternal.api.SpiDtoQuery; import io.ebeaninternal.api.SpiEbeanServer; @@ -47,6 +48,8 @@ public class DefaultDtoQuery implements SpiDtoQuery { */ private final BindParams bindParams = new BindParams(); + private Transaction transaction; + /** * Create given an underlying ORM query. */ @@ -88,6 +91,12 @@ public class DefaultDtoQuery implements SpiDtoQuery { descriptor.putQueryPlan(planKey, plan); } + @Override + public DtoQuery usingTransaction(Transaction transaction) { + this.transaction = transaction; + return this; + } + @Override public void findEach(Consumer consumer) { server.findDtoEach(this, consumer); @@ -148,6 +157,11 @@ public class DefaultDtoQuery implements SpiDtoQuery { return ormQuery; } + @Override + public Transaction getTransaction() { + return transaction; + } + @Override public DtoQuery setRelaxedMode() { this.relaxedMode = true; diff --git a/src/test/java/org/tests/basic/TestQueryUsingConnection.java b/src/test/java/org/tests/basic/TestQueryUsingConnection.java index 5b63c7d33..5aca4bfe5 100644 --- a/src/test/java/org/tests/basic/TestQueryUsingConnection.java +++ b/src/test/java/org/tests/basic/TestQueryUsingConnection.java @@ -14,6 +14,7 @@ import java.sql.Connection; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; public class TestQueryUsingConnection extends BaseTestCase { @@ -51,6 +52,15 @@ public class TestQueryUsingConnection extends BaseTestCase { DB.getDefault().insert(x, transaction); + final CountryDto dto = DB.findDto(CountryDto.class, "select code, name from o_country where code=?") + .usingTransaction(transaction) + .setParameter(1, "xx") + .findOne(); + + assertThat(dto).isNotNull(); + assertEquals("xx", dto.code); + assertEquals("WillRollThisBack", dto.name); + final int count = DB.find(Country.class) .usingTransaction(transaction) .findCount(); @@ -63,4 +73,14 @@ public class TestQueryUsingConnection extends BaseTestCase { } } + + public static class CountryDto { + final String code; + final String name; + + public CountryDto(String code, String name) { + this.code = code; + this.name = name; + } + } }