Skip to content

Commit 76ed7e2

Browse files
RobertHeimmp911de
authored andcommitted
Do not override existing limit in R2dbcEntityTemplate.selectOne.
Closes #1233
1 parent 1ae5174 commit 76ed7e2

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
* @author Bogdan Ilchyshyn
8888
* @author Jens Schauder
8989
* @author Jose Luis Leon
90+
* @author Robert Heim
9091
* @since 1.1
9192
*/
9293
public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAware, ApplicationContextAware {
@@ -420,7 +421,13 @@ private <T> RowsFetchSpec<T> doSelect(Query query, Class<?> entityClass, SqlIden
420421
*/
421422
@Override
422423
public <T> Mono<T> selectOne(Query query, Class<T> entityClass) throws DataAccessException {
423-
return doSelect(query.limit(2), entityClass, getTableName(entityClass), entityClass, RowsFetchSpec::one);
424+
Query q = query;
425+
/* If the query has not a defined limit, a limit of 2 is employed
426+
to catch cases where the query would yield more than one result. */
427+
if (query.getLimit() == -1) {
428+
q = query.limit(2);
429+
} // else: use the already defined limit.
430+
return doSelect(q, entityClass, getTableName(entityClass), entityClass, RowsFetchSpec::one);
424431
}
425432

426433
/*

spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
*
6969
* @author Mark Paluch
7070
* @author Jose Luis Leon
71+
* @author Robert Heim
7172
*/
7273
public class R2dbcEntityTemplateUnitTests {
7374

@@ -202,6 +203,22 @@ void shouldSelectOne() {
202203
assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter"));
203204
}
204205

206+
@Test // gh-220, gh-758
207+
void shouldSelectOneDoNotOverrideExistingLimit() {
208+
209+
recorder.addStubbing(s -> s.startsWith("SELECT"), Collections.emptyList());
210+
211+
entityTemplate.selectOne(Query.query(Criteria.where("name").is("Walter")).sort(Sort.by("name")).limit(1), Person.class) //
212+
.as(StepVerifier::create) //
213+
.verifyComplete();
214+
215+
StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT"));
216+
217+
assertThat(statement.getSql())
218+
.isEqualTo("SELECT person.* FROM person WHERE person.THE_NAME = $1 ORDER BY person.THE_NAME ASC LIMIT 1");
219+
assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter"));
220+
}
221+
205222
@Test // gh-220
206223
void shouldUpdateByQuery() {
207224

0 commit comments

Comments
 (0)