Browse Source

Do not override existing limit in `R2dbcEntityTemplate.selectOne`.

Closes #1233
pull/1235/head
Robert Heim 4 years ago committed by Mark Paluch
parent
commit
76ed7e23e4
No known key found for this signature in database
GPG Key ID: 4406B84C1661DCD1
  1. 9
      spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplate.java
  2. 17
      spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/R2dbcEntityTemplateUnitTests.java

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

@ -87,6 +87,7 @@ import org.springframework.util.Assert;
* @author Bogdan Ilchyshyn * @author Bogdan Ilchyshyn
* @author Jens Schauder * @author Jens Schauder
* @author Jose Luis Leon * @author Jose Luis Leon
* @author Robert Heim
* @since 1.1 * @since 1.1
*/ */
public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAware, ApplicationContextAware { public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAware, ApplicationContextAware {
@ -420,7 +421,13 @@ public class R2dbcEntityTemplate implements R2dbcEntityOperations, BeanFactoryAw
*/ */
@Override @Override
public <T> Mono<T> selectOne(Query query, Class<T> entityClass) throws DataAccessException { public <T> Mono<T> selectOne(Query query, Class<T> entityClass) throws DataAccessException {
return doSelect(query.limit(2), entityClass, getTableName(entityClass), entityClass, RowsFetchSpec::one); 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);
} }
/* /*

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

@ -68,6 +68,7 @@ import org.springframework.util.CollectionUtils;
* *
* @author Mark Paluch * @author Mark Paluch
* @author Jose Luis Leon * @author Jose Luis Leon
* @author Robert Heim
*/ */
public class R2dbcEntityTemplateUnitTests { public class R2dbcEntityTemplateUnitTests {
@ -202,6 +203,22 @@ public class R2dbcEntityTemplateUnitTests {
assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter")); assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter"));
} }
@Test // gh-220, gh-758
void shouldSelectOneDoNotOverrideExistingLimit() {
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) //
.as(StepVerifier::create) //
.verifyComplete();
StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("SELECT"));
assertThat(statement.getSql())
.isEqualTo("SELECT person.* FROM person WHERE person.THE_NAME = $1 ORDER BY person.THE_NAME ASC LIMIT 1");
assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Walter"));
}
@Test // gh-220 @Test // gh-220
void shouldUpdateByQuery() { void shouldUpdateByQuery() {

Loading…
Cancel
Save