diff --git a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java index e90a2d36..3dcabb3b 100644 --- a/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java +++ b/spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java @@ -151,8 +151,7 @@ public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAw * @param databaseClient must not be {@literal null}. * @since 1.2 */ - public R2dbcEntityTemplate(DatabaseClient databaseClient, - ReactiveDataAccessStrategy strategy) { + public R2dbcEntityTemplate(DatabaseClient databaseClient, ReactiveDataAccessStrategy strategy) { Assert.notNull(databaseClient, "DatabaseClient must not be null"); Assert.notNull(strategy, "ReactiveDataAccessStrategy must not be null"); @@ -421,13 +420,8 @@ public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAw */ @Override public Mono selectOne(Query query, Class entityClass) throws DataAccessException { - Query q = query; - /* If the query has not a defined limit, a limit of 2 is employed - to catch cases where the query would yield more than one result. */ - if (query.getLimit() == -1) { - q = query.limit(2); - } // else: use the already defined limit. - return doSelect(q, entityClass, getTableName(entityClass), entityClass, RowsFetchSpec::one); + return doSelect(query.isLimited() ? query : query.limit(2), entityClass, getTableName(entityClass), entityClass, + RowsFetchSpec::one); } /* diff --git a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java index d887e8a2..10be5810 100644 --- a/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java +++ b/spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java @@ -90,8 +90,7 @@ public class R2dbcEntityTemplateUnitTests { MockRowMetadata metadata = MockRowMetadata.builder() .columnMetadata(MockColumnMetadata.builder().name("name").type(R2dbcType.VARCHAR).build()).build(); - MockResult result = MockResult.builder() - .row(MockRow.builder().identified(0, Long.class, 1L).build()).build(); + MockResult result = MockResult.builder().row(MockRow.builder().identified(0, Long.class, 1L).build()).build(); recorder.addStubbing(s -> s.startsWith("SELECT"), result); @@ -111,8 +110,7 @@ public class R2dbcEntityTemplateUnitTests { MockRowMetadata metadata = MockRowMetadata.builder() .columnMetadata(MockColumnMetadata.builder().name("name").type(R2dbcType.VARCHAR).build()).build(); - MockResult result = MockResult.builder() - .row(MockRow.builder().identified(0, Object.class, null).build()).build(); + MockResult result = MockResult.builder().row(MockRow.builder().identified(0, Object.class, null).build()).build(); recorder.addStubbing(s -> s.startsWith("SELECT"), result); @@ -129,8 +127,7 @@ public class R2dbcEntityTemplateUnitTests { MockRowMetadata metadata = MockRowMetadata.builder() .columnMetadata(MockColumnMetadata.builder().name("name").type(R2dbcType.VARCHAR).build()).build(); - MockResult result = MockResult.builder() - .row(MockRow.builder().identified(0, Long.class, 1L).build()).build(); + MockResult result = MockResult.builder().row(MockRow.builder().identified(0, Long.class, 1L).build()).build(); recorder.addStubbing(s -> s.startsWith("SELECT"), result); @@ -208,7 +205,8 @@ public class R2dbcEntityTemplateUnitTests { recorder.addStubbing(s -> s.startsWith("SELECT"), Collections.emptyList()); - entityTemplate.selectOne(Query.query(Criteria.where("name").is("Walter")).sort(Sort.by("name")).limit(1), Person.class) // + entityTemplate + .selectOne(Query.query(Criteria.where("name").is("Walter")).sort(Sort.by("name")).limit(1), Person.class) // .as(StepVerifier::create) // .verifyComplete(); diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Query.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Query.java index 5e1b6303..50190d6c 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Query.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/query/Query.java @@ -41,6 +41,8 @@ import org.springframework.util.Assert; */ public class Query { + private static final int NO_LIMIT = -1; + private final @Nullable CriteriaDefinition criteria; private final List columns; @@ -64,7 +66,7 @@ public class Query { * @param criteria must not be {@literal null}. */ private Query(@Nullable CriteriaDefinition criteria) { - this(criteria, Collections.emptyList(), Sort.unsorted(), -1, -1); + this(criteria, Collections.emptyList(), Sort.unsorted(), NO_LIMIT, NO_LIMIT); } private Query(@Nullable CriteriaDefinition criteria, List columns, Sort sort, int limit, long offset) { @@ -248,6 +250,17 @@ public class Query { return this.limit; } + /** + * Return whether the query has a limit. + * + * @return {@code true} if a limit is set. + * @see #getLimit() + * @since 3.0 + */ + public boolean isLimited() { + return getLimit() != NO_LIMIT; + } + private static void assertNoCaseSort(Sort sort) { for (Sort.Order order : sort) {