Skip to content

Commit 6f64990

Browse files
kazuki43zooschauder
authored andcommitted
DATAJDBC-172 - Support entity type, Optional and Stream as return type of @query methods.
Original pull request: #40.
1 parent 9a90d7e commit 6f64990

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.jdbc.repository.support;
1717

18+
import org.springframework.dao.EmptyResultDataAccessException;
1819
import org.springframework.data.jdbc.mapping.model.JdbcMappingContext;
1920
import org.springframework.data.repository.query.RepositoryQuery;
2021
import org.springframework.jdbc.core.RowMapper;
@@ -53,7 +54,15 @@ public Object execute(Object[] objects) {
5354
parameters.addValue(parameterName, objects[p.getIndex()]);
5455
});
5556

56-
return context.getTemplate().query(query, parameters, rowMapper);
57+
if (queryMethod.isCollectionQuery() || queryMethod.isStreamQuery()) {
58+
return context.getTemplate().query(query, parameters, rowMapper);
59+
} else {
60+
try {
61+
return context.getTemplate().queryForObject(query, parameters, rowMapper);
62+
} catch (EmptyResultDataAccessException e) {
63+
return null;
64+
}
65+
}
5766
}
5867

5968
@Override

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

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import static org.assertj.core.api.Assertions.*;
1919

2020
import java.util.List;
21+
import java.util.Optional;
22+
import java.util.stream.Stream;
2123

2224
import org.junit.ClassRule;
2325
import org.junit.Rule;
@@ -80,6 +82,57 @@ public void executeCustomQueryWithNamedParameters() {
8082

8183
}
8284

85+
@Test // DATAJDBC-172
86+
public void executeCustomQueryWithReturnTypeIsOptional() {
87+
88+
DummyEntity dummyEntity = dummyEntity("a");
89+
repository.save(dummyEntity);
90+
91+
Optional<DummyEntity> entity = repository.findByIdWithReturnTypeIsOptional(dummyEntity.id);
92+
93+
assertThat(entity).map(e -> e.name).contains("a");
94+
95+
}
96+
97+
@Test // DATAJDBC-172
98+
public void executeCustomQueryWithReturnTypeIsOptionalWhenEntityNotFound() {
99+
100+
DummyEntity dummyEntity = dummyEntity("a");
101+
repository.save(dummyEntity);
102+
103+
Optional<DummyEntity> entity = repository.findByIdWithReturnTypeIsOptional(9999L);
104+
105+
assertThat(entity).isNotPresent();
106+
107+
}
108+
109+
@Test // DATAJDBC-172
110+
public void executeCustomQueryWithReturnTypeIsEntity() {
111+
112+
DummyEntity dummyEntity = dummyEntity("a");
113+
repository.save(dummyEntity);
114+
115+
DummyEntity entity = repository.findByIdWithReturnTypeIsEntity(dummyEntity.id);
116+
117+
assertThat(entity).isNotNull();
118+
assertThat(entity.name).isEqualTo("a");
119+
120+
}
121+
122+
@Test // DATAJDBC-172
123+
public void executeCustomQueryWithReturnTypeIsStream() {
124+
125+
repository.save(dummyEntity("a"));
126+
repository.save(dummyEntity("b"));
127+
128+
Stream<DummyEntity> entities = repository.findAllWithReturnTypeIsStream();
129+
130+
assertThat(entities) //
131+
.extracting(e -> e.name) //
132+
.containsExactlyInAnyOrder("a", "b");
133+
134+
}
135+
83136
private DummyEntity dummyEntity(String name) {
84137

85138
DummyEntity entity = new DummyEntity();
@@ -110,8 +163,17 @@ private interface DummyEntityRepository extends CrudRepository<DummyEntity, Long
110163
@Query("SELECT * FROM DUMMYENTITY WHERE lower(name) <> name")
111164
List<DummyEntity> findByNameContainingCapitalLetter();
112165

113-
114166
@Query("SELECT * FROM DUMMYENTITY WHERE name < :upper and name > :lower")
115167
List<DummyEntity> findByNamedRangeWithNamedParameter(@Param("lower") String lower, @Param("upper") String upper);
168+
169+
@Query("SELECT * FROM DUMMYENTITY WHERE id = :id FOR UPDATE")
170+
Optional<DummyEntity> findByIdWithReturnTypeIsOptional(@Param("id") Long id);
171+
172+
@Query("SELECT * FROM DUMMYENTITY WHERE id = :id FOR UPDATE")
173+
DummyEntity findByIdWithReturnTypeIsEntity(@Param("id") Long id);
174+
175+
@Query("SELECT * FROM DUMMYENTITY")
176+
Stream<DummyEntity> findAllWithReturnTypeIsStream();
177+
116178
}
117179
}

0 commit comments

Comments
 (0)