diff --git a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java index 4c5c35abd..c8a008351 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -417,6 +417,8 @@ public interface SpiQuery extends Query, SpiQueryFetch, TxnProfileEventCod /** * Return a copy of the query. + *

+ * Note that this does NOT copy the forUpdate property. See #2762. */ @Override SpiQuery copy(); diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index fac507f80..86bb27c5a 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -708,6 +708,7 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { @Override public SpiQuery copy(SpiEbeanServer server) { + // forUpdate is NOT copied - see #2762 DefaultOrmQuery copy = new DefaultOrmQuery<>(beanDescriptor, server, expressionFactory); copy.transaction = transaction; copy.m2mIncludeJoin = m2mIncludeJoin; @@ -748,7 +749,6 @@ public class DefaultOrmQuery extends AbstractQuery implements SpiQuery { copy.usageProfiling = usageProfiling; copy.autoTune = autoTune; copy.parentNode = parentNode; - copy.forUpdate = forUpdate; copy.rawSql = rawSql; setCancelableQuery(copy); // required to cancel findId query return copy; diff --git a/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java b/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java index 73ccb1c33..69092641e 100644 --- a/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java +++ b/ebean-test/src/test/java/org/tests/query/TestQueryFindPagedList.java @@ -1,9 +1,10 @@ package org.tests.query; -import io.ebean.xtest.BaseTestCase; import io.ebean.DB; import io.ebean.PagedList; +import io.ebean.Transaction; import io.ebean.test.LoggedSql; +import io.ebean.xtest.BaseTestCase; import org.junit.jupiter.api.Test; import org.tests.model.basic.Customer; import org.tests.model.basic.Order; @@ -264,4 +265,27 @@ public class TestQueryFindPagedList extends BaseTestCase { assertThat(loggedSql.get(0)).contains("select count(*) from o_order b where b.id > 0"); assertThat(trimSql(loggedSql.get(1), 3)).contains(" b.id, b.status, b.order_date"); } + + @Test + void test_forUpdate() { + ResetBasicData.reset(); + + try (Transaction txn = DB.beginTransaction()) { + PagedList pagedList = DB.find(Order.class).forUpdate().setMaxRows(2).findPagedList(); + + LoggedSql.start(); + int totalCount = pagedList.getTotalCount(); + assertThat(totalCount).isGreaterThan(2); + + List list = pagedList.getList(); + assertThat(list).hasSize(2); + + List sql = LoggedSql.stop(); + assertThat(sql).hasSize(2); + assertThat(sql.get(0)).contains("select count(*) from o_order t0;"); + if (isH2() || isPostgresCompatible()) { + assertThat(sql.get(1)).contains(" limit 2 for update;"); + } + } + } }