Skip to content

Commit 1db5190

Browse files
committed
Add support for returning Streamable from AOT repository methods.
Closes #2175
1 parent f2541b3 commit 1db5190

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/aot/JdbcCodeBlocks.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.springframework.data.repository.query.parser.Part;
5050
import org.springframework.data.support.PageableExecutionUtils;
5151
import org.springframework.data.util.Pair;
52+
import org.springframework.data.util.Streamable;
5253
import org.springframework.javapoet.CodeBlock;
5354
import org.springframework.javapoet.CodeBlock.Builder;
5455
import org.springframework.javapoet.TypeName;
@@ -811,8 +812,14 @@ private CodeBlock select(ExecutionDecorator decorator, String rowMapper, String
811812
return builder.build();
812813
}
813814

814-
builder.addStatement("return ($T) convertMany($L, %s)".formatted(dynamicProjection ? "$L" : "$T.class"),
815-
methodReturn.getTypeName(), result, queryResultTypeRef);
815+
if (methodReturn.toClass().equals(Streamable.class)) {
816+
builder.addStatement(
817+
"return ($1T) $1T.of(($2T) convertMany($3L, %s))".formatted(dynamicProjection ? "$4L" : "$4T.class"),
818+
Streamable.class, Iterable.class, result, queryResultTypeRef);
819+
} else {
820+
builder.addStatement("return ($T) convertMany($L, %s)".formatted(dynamicProjection ? "$L" : "$T.class"),
821+
methodReturn.getTypeName(), result, queryResultTypeRef);
822+
}
816823
} else if (queryMethod.isStreamQuery()) {
817824

818825
builder.addStatement("$1T $2L = " + decorator.decorate("getJdbcOperations().queryForStream($3L, $4L, $5L)"),

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.springframework.data.jdbc.testing.IntegrationTest;
4848
import org.springframework.data.jdbc.testing.TestClass;
4949
import org.springframework.data.jdbc.testing.TestConfiguration;
50+
import org.springframework.data.util.Streamable;
5051
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
5152

5253
/**
@@ -188,6 +189,14 @@ void shouldFindBetween() {
188189
assertThat(users).hasSize(2);
189190
}
190191

192+
@Test // GH-2175
193+
void shouldReturnStreamable() {
194+
195+
Streamable<User> users = fragment.findStreamableByAgeBetween(40, 51);
196+
197+
assertThat(users).hasSize(2);
198+
}
199+
191200
@Test // GH-2121
192201
void streamByAgeGreaterThan() {
193202
assertThat(fragment.streamByAgeGreaterThan(20)).hasSize(5);
@@ -221,6 +230,14 @@ void shouldReturnPage() {
221230
assertThat(page.hasNext()).isFalse();
222231
}
223232

233+
@Test // GH-2175
234+
void shouldReturnPagedStreamable() {
235+
236+
Streamable<User> result = fragment.findStreamableByAgeGreaterThan(PageRequest.of(0, 4, Sort.by("age")), 10);
237+
238+
assertThat(result).hasSize(4);
239+
}
240+
224241
@Test // GH-2121
225242
void countByAgeLessThan() {
226243

@@ -313,6 +330,14 @@ void shouldSupportDeclaredQueryWithConverter() {
313330
assertThat(users).hasSize(6);
314331
}
315332

333+
@Test // GH-2175
334+
void shouldReturnStreamableFromDeclaredQuery() {
335+
336+
Streamable<User> users = fragment.findStreamableCreatedBefore(Instant.now().plusSeconds(180));
337+
338+
assertThat(users).hasSize(6);
339+
}
340+
316341
@Test // GH-2174
317342
void shouldSupportDeclaredQueryWithAggregateReference() {
318343

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.data.jdbc.repository.query.Query;
2929
import org.springframework.data.repository.CrudRepository;
3030
import org.springframework.data.repository.query.Param;
31+
import org.springframework.data.util.Streamable;
3132

3233
public interface UserRepository extends CrudRepository<User, Integer> {
3334

@@ -51,6 +52,8 @@ public interface UserRepository extends CrudRepository<User, Integer> {
5152

5253
List<User> findAllByAgeBetween(int start, int end);
5354

55+
Streamable<User> findStreamableByAgeBetween(int start, int end);
56+
5457
Optional<User> findOptionalByFirstname(String name);
5558

5659
Stream<User> streamByAgeGreaterThan(int age);
@@ -67,6 +70,8 @@ public interface UserRepository extends CrudRepository<User, Integer> {
6770

6871
Page<User> findPageByAgeGreaterThan(Pageable pageable, int age);
6972

73+
Streamable<User> findStreamableByAgeGreaterThan(Pageable pageable, int age);
74+
7075
// -------------------------------------------------------------------------
7176
// Declared Queries
7277
// -------------------------------------------------------------------------
@@ -97,6 +102,9 @@ public interface UserRepository extends CrudRepository<User, Integer> {
97102
@Query(value = "SELECT * FROM MY_USER WHERE created < :instant")
98103
List<User> findCreatedBefore(Instant instant);
99104

105+
@Query(value = "SELECT * FROM MY_USER WHERE created < :instant")
106+
Streamable<User> findStreamableCreatedBefore(Instant instant);
107+
100108
// -------------------------------------------------------------------------
101109
// Parameter naming
102110
// -------------------------------------------------------------------------

0 commit comments

Comments
 (0)