Skip to content

Commit 370ee44

Browse files
schaudermp911de
authored andcommitted
DATAJDBC-529 - Use specialized ResultSetExtractor for exists queries.
Exists queries do not look at the value returned in the ResultSet but just check if there is a row. Original pull request: #212.
1 parent 2029a0c commit 370ee44

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/AbstractJdbcQuery.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,10 @@ public JdbcQueryMethod getQueryMethod() {
8080
* @param queryMethod must not be {@literal null}.
8181
* @param extractor must not be {@literal null}.
8282
* @param rowMapper must not be {@literal null}.
83-
* @return
83+
* @return a JdbcQueryExecution appropriate for {@literal queryMethod}. Guaranteed to be not {@literal null}.
8484
*/
8585
protected JdbcQueryExecution<?> getQueryExecution(JdbcQueryMethod queryMethod,
86-
@Nullable ResultSetExtractor<Object> extractor, RowMapper<Object> rowMapper) {
86+
@Nullable ResultSetExtractor<?> extractor, RowMapper<?> rowMapper) {
8787

8888
if (queryMethod.isModifyingQuery()) {
8989
return createModifyingQueryExecutor();

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/PartTreeJdbcQuery.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,13 @@
2424
import org.springframework.data.relational.repository.query.RelationalParametersParameterAccessor;
2525
import org.springframework.data.repository.query.Parameters;
2626
import org.springframework.data.repository.query.parser.PartTree;
27+
import org.springframework.jdbc.core.ResultSetExtractor;
2728
import org.springframework.jdbc.core.RowMapper;
2829
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations;
2930
import org.springframework.util.Assert;
3031

32+
import java.sql.ResultSet;
33+
3134
/**
3235
* An {@link AbstractJdbcQuery} implementation based on a {@link PartTree}.
3336
*
@@ -72,7 +75,9 @@ public PartTreeJdbcQuery(RelationalMappingContext context, JdbcQueryMethod query
7275
this.tree = new PartTree(queryMethod.getName(), queryMethod.getEntityInformation().getJavaType());
7376
JdbcQueryCreator.validate(this.tree, this.parameters, this.converter.getMappingContext());
7477

75-
this.execution = getQueryExecution(queryMethod, null, rowMapper);
78+
ResultSetExtractor<Boolean> extractor = tree.isExistsProjection() ? (ResultSet::next) : null;
79+
80+
this.execution = getQueryExecution(queryMethod, extractor, rowMapper);
7681
}
7782

7883
private Sort getDynamicSort(RelationalParameterAccessor accessor) {

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/JdbcRepositoryIntegrationTests.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@
2626
import java.util.ArrayList;
2727
import java.util.List;
2828

29+
import org.assertj.core.api.SoftAssertions;
2930
import org.junit.Before;
3031
import org.junit.ClassRule;
3132
import org.junit.Rule;
3233
import org.junit.Test;
33-
3434
import org.springframework.beans.factory.annotation.Autowired;
3535
import org.springframework.beans.factory.config.PropertiesFactoryBean;
3636
import org.springframework.context.ApplicationListener;
@@ -355,6 +355,22 @@ public void findWithMissingQuery() {
355355
assertThat(loaded.pointInTime).isNull();
356356
}
357357

358+
@Test // DATAJDBC-529
359+
public void existsWorksAsExpected() {
360+
361+
DummyEntity dummy = repository.save(createDummyEntity());
362+
363+
SoftAssertions.assertSoftly(softly -> {
364+
365+
softly.assertThat(repository.existsByName(dummy.getName())) //
366+
.describedAs("Positive") //
367+
.isTrue();
368+
softly.assertThat(repository.existsByName("not an existing name")) //
369+
.describedAs("Positive") //
370+
.isFalse();
371+
});
372+
}
373+
358374
private static DummyEntity createDummyEntity() {
359375

360376
DummyEntity entity = new DummyEntity();
@@ -380,6 +396,8 @@ interface DummyEntityRepository extends CrudRepository<DummyEntity, Long> {
380396

381397
@Query("SELECT id_Prop from dummy_entity where id_Prop = :id")
382398
DummyEntity withMissingColumn(@Param("id") Long id);
399+
400+
boolean existsByName(String name);
383401
}
384402

385403
@Data

0 commit comments

Comments
 (0)