Browse Source

Add support for returning `Streamable` from AOT repository methods.

Closes #2175
issue/year-as-integer
Mark Paluch 1 month ago
parent
commit
1db519008d
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 11
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/aot/JdbcCodeBlocks.java
  2. 25
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/aot/JdbcRepositoryContributorIntegrationTests.java
  3. 8
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/aot/UserRepository.java

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

@ -49,6 +49,7 @@ import org.springframework.data.repository.aot.generate.MethodReturn; @@ -49,6 +49,7 @@ import org.springframework.data.repository.aot.generate.MethodReturn;
import org.springframework.data.repository.query.parser.Part;
import org.springframework.data.support.PageableExecutionUtils;
import org.springframework.data.util.Pair;
import org.springframework.data.util.Streamable;
import org.springframework.javapoet.CodeBlock;
import org.springframework.javapoet.CodeBlock.Builder;
import org.springframework.javapoet.TypeName;
@ -811,8 +812,14 @@ class JdbcCodeBlocks { @@ -811,8 +812,14 @@ class JdbcCodeBlocks {
return builder.build();
}
builder.addStatement("return ($T) convertMany($L, %s)".formatted(dynamicProjection ? "$L" : "$T.class"),
methodReturn.getTypeName(), result, queryResultTypeRef);
if (methodReturn.toClass().equals(Streamable.class)) {
builder.addStatement(
"return ($1T) $1T.of(($2T) convertMany($3L, %s))".formatted(dynamicProjection ? "$4L" : "$4T.class"),
Streamable.class, Iterable.class, result, queryResultTypeRef);
} else {
builder.addStatement("return ($T) convertMany($L, %s)".formatted(dynamicProjection ? "$L" : "$T.class"),
methodReturn.getTypeName(), result, queryResultTypeRef);
}
} else if (queryMethod.isStreamQuery()) {
builder.addStatement("$1T $2L = " + decorator.decorate("getJdbcOperations().queryForStream($3L, $4L, $5L)"),

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

@ -47,6 +47,7 @@ import org.springframework.data.jdbc.testing.EnabledOnDatabase; @@ -47,6 +47,7 @@ import org.springframework.data.jdbc.testing.EnabledOnDatabase;
import org.springframework.data.jdbc.testing.IntegrationTest;
import org.springframework.data.jdbc.testing.TestClass;
import org.springframework.data.jdbc.testing.TestConfiguration;
import org.springframework.data.util.Streamable;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
/**
@ -188,6 +189,14 @@ class JdbcRepositoryContributorIntegrationTests { @@ -188,6 +189,14 @@ class JdbcRepositoryContributorIntegrationTests {
assertThat(users).hasSize(2);
}
@Test // GH-2175
void shouldReturnStreamable() {
Streamable<User> users = fragment.findStreamableByAgeBetween(40, 51);
assertThat(users).hasSize(2);
}
@Test // GH-2121
void streamByAgeGreaterThan() {
assertThat(fragment.streamByAgeGreaterThan(20)).hasSize(5);
@ -221,6 +230,14 @@ class JdbcRepositoryContributorIntegrationTests { @@ -221,6 +230,14 @@ class JdbcRepositoryContributorIntegrationTests {
assertThat(page.hasNext()).isFalse();
}
@Test // GH-2175
void shouldReturnPagedStreamable() {
Streamable<User> result = fragment.findStreamableByAgeGreaterThan(PageRequest.of(0, 4, Sort.by("age")), 10);
assertThat(result).hasSize(4);
}
@Test // GH-2121
void countByAgeLessThan() {
@ -313,6 +330,14 @@ class JdbcRepositoryContributorIntegrationTests { @@ -313,6 +330,14 @@ class JdbcRepositoryContributorIntegrationTests {
assertThat(users).hasSize(6);
}
@Test // GH-2175
void shouldReturnStreamableFromDeclaredQuery() {
Streamable<User> users = fragment.findStreamableCreatedBefore(Instant.now().plusSeconds(180));
assertThat(users).hasSize(6);
}
@Test // GH-2174
void shouldSupportDeclaredQueryWithAggregateReference() {

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

@ -28,6 +28,7 @@ import org.springframework.data.jdbc.repository.query.Modifying; @@ -28,6 +28,7 @@ import org.springframework.data.jdbc.repository.query.Modifying;
import org.springframework.data.jdbc.repository.query.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.util.Streamable;
public interface UserRepository extends CrudRepository<User, Integer> {
@ -51,6 +52,8 @@ public interface UserRepository extends CrudRepository<User, Integer> { @@ -51,6 +52,8 @@ public interface UserRepository extends CrudRepository<User, Integer> {
List<User> findAllByAgeBetween(int start, int end);
Streamable<User> findStreamableByAgeBetween(int start, int end);
Optional<User> findOptionalByFirstname(String name);
Stream<User> streamByAgeGreaterThan(int age);
@ -67,6 +70,8 @@ public interface UserRepository extends CrudRepository<User, Integer> { @@ -67,6 +70,8 @@ public interface UserRepository extends CrudRepository<User, Integer> {
Page<User> findPageByAgeGreaterThan(Pageable pageable, int age);
Streamable<User> findStreamableByAgeGreaterThan(Pageable pageable, int age);
// -------------------------------------------------------------------------
// Declared Queries
// -------------------------------------------------------------------------
@ -97,6 +102,9 @@ public interface UserRepository extends CrudRepository<User, Integer> { @@ -97,6 +102,9 @@ public interface UserRepository extends CrudRepository<User, Integer> {
@Query(value = "SELECT * FROM MY_USER WHERE created < :instant")
List<User> findCreatedBefore(Instant instant);
@Query(value = "SELECT * FROM MY_USER WHERE created < :instant")
Streamable<User> findStreamableCreatedBefore(Instant instant);
// -------------------------------------------------------------------------
// Parameter naming
// -------------------------------------------------------------------------

Loading…
Cancel
Save