Skip to content

Commit 5f6a44d

Browse files
committed
DATAJDBC-182 - Polishing.
Extracted method to maintain a single level of abstraction. Added description to assertion that wasn't obvious to me. Added JavaDoc on existing method. Commented repository methods in test with issue ids to ease understanding the purpose of each method.
1 parent 73fe1ca commit 5f6a44d

File tree

3 files changed

+56
-35
lines changed

3 files changed

+56
-35
lines changed

src/main/java/org/springframework/data/jdbc/repository/support/JdbcQueryLookupStrategy.java

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,21 @@ public RepositoryQuery resolveQuery(Method method, RepositoryMetadata repository
5656

5757
JdbcQueryMethod queryMethod = new JdbcQueryMethod(method, repositoryMetadata, projectionFactory);
5858
Class<?> returnedObjectType = queryMethod.getReturnedObjectType();
59-
RowMapper<?> rowMapper = null;
60-
if (!queryMethod.isModifyingQuery()) {
61-
rowMapper = context.getSimpleTypeHolder().isSimpleType(returnedObjectType)
62-
? SingleColumnRowMapper.newInstance(returnedObjectType, conversionService)
63-
: new EntityRowMapper<>( //
64-
context.getRequiredPersistentEntity(returnedObjectType), //
65-
conversionService, //
66-
context, //
67-
accessStrategy //
68-
);
69-
}
59+
60+
RowMapper<?> rowMapper = queryMethod.isModifyingQuery() ? null : createRowMapper(returnedObjectType);
61+
7062
return new JdbcRepositoryQuery(queryMethod, context, rowMapper);
7163
}
7264

65+
private RowMapper<?> createRowMapper(Class<?> returnedObjectType) {
66+
67+
return context.getSimpleTypeHolder().isSimpleType(returnedObjectType)
68+
? SingleColumnRowMapper.newInstance(returnedObjectType, conversionService)
69+
: new EntityRowMapper<>( //
70+
context.getRequiredPersistentEntity(returnedObjectType), //
71+
conversionService, //
72+
context, //
73+
accessStrategy //
74+
);
75+
}
7376
}

src/main/java/org/springframework/data/jdbc/repository/support/JdbcQueryMethod.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.data.projection.ProjectionFactory;
2525
import org.springframework.data.repository.core.RepositoryMetadata;
2626
import org.springframework.data.repository.query.QueryMethod;
27+
import org.springframework.lang.Nullable;
2728

2829
/**
2930
* {@link QueryMethod} implementation that implements a method by executing the query from a {@link Query} annotation on
@@ -44,6 +45,12 @@ public JdbcQueryMethod(Method method, RepositoryMetadata metadata, ProjectionFac
4445
this.method = method;
4546
}
4647

48+
/**
49+
* Returns the annotated query if it exists.
50+
*
51+
* @return May be {@code null}.
52+
*/
53+
@Nullable
4754
public String getAnnotatedQuery() {
4855

4956
Query queryAnnotation = AnnotatedElementUtils.findMergedAnnotation(method, Query.class);

src/test/java/org/springframework/data/jdbc/repository/query/QueryAnnotationHsqlIntegrationTests.java

Lines changed: 35 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,14 @@
1515
*/
1616
package org.springframework.data.jdbc.repository.query;
1717

18+
import static org.assertj.core.api.Assertions.*;
19+
20+
import java.time.LocalDateTime;
21+
import java.util.Date;
22+
import java.util.List;
23+
import java.util.Optional;
24+
import java.util.stream.Stream;
25+
1826
import org.junit.ClassRule;
1927
import org.junit.Rule;
2028
import org.junit.Test;
@@ -33,14 +41,6 @@
3341
import org.springframework.test.context.junit4.rules.SpringMethodRule;
3442
import org.springframework.transaction.annotation.Transactional;
3543

36-
import java.time.LocalDateTime;
37-
import java.util.Date;
38-
import java.util.List;
39-
import java.util.Optional;
40-
import java.util.stream.Stream;
41-
42-
import static org.assertj.core.api.Assertions.*;
43-
4444
/**
4545
* Tests the execution of queries from {@link Query} annotations on repository methods.
4646
*
@@ -51,13 +51,10 @@
5151
@Transactional
5252
public class QueryAnnotationHsqlIntegrationTests {
5353

54-
@Autowired
55-
DummyEntityRepository repository;
54+
@Autowired DummyEntityRepository repository;
5655

57-
@ClassRule
58-
public static final SpringClassRule classRule = new SpringClassRule();
59-
@Rule
60-
public SpringMethodRule methodRule = new SpringMethodRule();
56+
@ClassRule public static final SpringClassRule classRule = new SpringClassRule();
57+
@Rule public SpringMethodRule methodRule = new SpringMethodRule();
6158

6259
@Test // DATAJDBC-164
6360
public void executeCustomQueryWithoutParameter() {
@@ -167,7 +164,7 @@ public void executeCustomQueryWithReturnTypeIsStream() {
167164
.containsExactlyInAnyOrder("a", "b");
168165

169166
}
170-
167+
171168
@Test // DATAJDBC-175
172169
public void executeCustomQueryWithReturnTypeIsNubmer() {
173170

@@ -211,36 +208,40 @@ public void executeCustomQueryWithReturnTypeIsLocalDateTimeList() {
211208
}
212209

213210
@Test // DATAJDBC-182
214-
public void executeCustomModifyingQueryWithReturnTypeIsNumber() {
211+
public void executeCustomModifyingQueryWithReturnTypeNumber() {
215212

216213
DummyEntity entity = dummyEntity("a");
217214
repository.save(entity);
218215

219216
assertThat(repository.updateName(entity.id, "b")).isEqualTo(1);
220-
assertThat(repository.updateName(9999L, "b")).isEqualTo(0);
221-
assertThat(repository.findById(entity.id)).isPresent().map(e -> e.name).contains("b");
217+
assertThat(repository.updateName(9999L, "c")).isEqualTo(0);
222218

219+
assertThat(repository.findById(entity.id)) //
220+
.describedAs("update was not performed as expected") //
221+
.isPresent() //
222+
.map(e -> e.name).contains("b");
223223
}
224224

225225
@Test // DATAJDBC-182
226-
public void executeCustomModifyingQueryWithReturnTypeIsBoolean() {
226+
public void executeCustomModifyingQueryWithReturnTypeBoolean() {
227227

228228
DummyEntity entity = dummyEntity("a");
229229
repository.save(entity);
230230

231231
assertThat(repository.deleteByName("a")).isTrue();
232232
assertThat(repository.deleteByName("b")).isFalse();
233-
assertThat(repository.findById(entity.id)).isNotPresent();
234233

234+
assertThat(repository.findById(entity.id)) //
235+
.describedAs("delete not performed as expected") //
236+
.isNotPresent();
235237
}
236238

237239
@Test // DATAJDBC-182
238-
public void executeCustomModifyingQueryWithReturnTypeIsVoid() {
240+
public void executeCustomModifyingQueryWithReturnTypeVoid() {
239241

240242
repository.insert("Spring Data JDBC");
241243

242244
assertThat(repository.findByNameAsEntity("Spring Data JDBC")).isNotNull();
243-
244245
}
245246

246247
private DummyEntity dummyEntity(String name) {
@@ -263,49 +264,59 @@ Class<?> testClass() {
263264

264265
private static class DummyEntity {
265266

266-
@Id
267-
Long id;
267+
@Id Long id;
268268

269269
String name;
270270
}
271271

272272
private interface DummyEntityRepository extends CrudRepository<DummyEntity, Long> {
273273

274+
// DATAJDBC-164
274275
@Query("SELECT * FROM DUMMYENTITY WHERE lower(name) <> name")
275276
List<DummyEntity> findByNameContainingCapitalLetter();
276277

278+
// DATAJDBC-164
277279
@Query("SELECT * FROM DUMMYENTITY WHERE name < :upper and name > :lower")
278280
List<DummyEntity> findByNamedRangeWithNamedParameter(@Param("lower") String lower, @Param("upper") String upper);
279281

280282
@Query("SELECT * FROM DUMMYENTITY WHERE name = :name")
281283
Optional<DummyEntity> findByNameAsOptional(@Param("name") String name);
282284

285+
// DATAJDBC-172
283286
@Query("SELECT * FROM DUMMYENTITY WHERE name = :name")
284287
DummyEntity findByNameAsEntity(@Param("name") String name);
285288

289+
// DATAJDBC-172
286290
@Query("SELECT * FROM DUMMYENTITY")
287291
Stream<DummyEntity> findAllWithReturnTypeIsStream();
288292

293+
// DATAJDBC-175
289294
@Query("SELECT count(*) FROM DUMMYENTITY WHERE name like '%' || :name || '%'")
290295
int countByNameContaining(@Param("name") String name);
291296

297+
// DATAJDBC-175
292298
@Query("SELECT count(*) FROM DUMMYENTITY WHERE name like '%' || :name || '%'")
293299
boolean existsByNameContaining(@Param("name") String name);
294300

301+
// DATAJDBC-175
295302
@Query("VALUES (current_timestamp)")
296303
Date nowWithDate();
297304

305+
// DATAJDBC-175
298306
@Query("VALUES (current_timestamp),(current_timestamp)")
299307
List<LocalDateTime> nowWithLocalDateTimeList();
300308

309+
// DATAJDBC-182
301310
@Modifying
302311
@Query("UPDATE DUMMYENTITY SET name = :name WHERE id = :id")
303312
int updateName(@Param("id") Long id, @Param("name") String name);
304313

314+
// DATAJDBC-182
305315
@Modifying
306316
@Query("DELETE FROM DUMMYENTITY WHERE name = :name")
307317
boolean deleteByName(@Param("name") String name);
308318

319+
// DATAJDBC-182
309320
@Modifying
310321
@Query("INSERT INTO DUMMYENTITY (name) VALUES(:name)")
311322
void insert(@Param("name") String name);

0 commit comments

Comments
 (0)