From c7451653666bf754735cec0b80fae9081b83aa4b Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Fri, 8 Jan 2021 11:03:55 +0100 Subject: [PATCH] Read domain type when returning an implemented interface from repository query methods. We now read the domain type instead of trying to materialize an interface if the type returned from the query method is implemented by the domain object handled by the repository. Closes #519 --- .../r2dbc/repository/query/AbstractR2dbcQuery.java | 4 ++++ .../AbstractR2dbcRepositoryIntegrationTests.java | 7 ++++++- .../repository/H2R2dbcRepositoryIntegrationTests.java | 11 +++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/r2dbc/repository/query/AbstractR2dbcQuery.java b/src/main/java/org/springframework/data/r2dbc/repository/query/AbstractR2dbcQuery.java index 06230fd..96955c0 100644 --- a/src/main/java/org/springframework/data/r2dbc/repository/query/AbstractR2dbcQuery.java +++ b/src/main/java/org/springframework/data/r2dbc/repository/query/AbstractR2dbcQuery.java @@ -129,6 +129,10 @@ public abstract class AbstractR2dbcQuery implements RepositoryQuery { ReturnedType returnedType = resultProcessor.getReturnedType(); + if (returnedType.getReturnedType().isAssignableFrom(returnedType.getDomainType())) { + return returnedType.getDomainType(); + } + return returnedType.isProjecting() ? returnedType.getDomainType() : returnedType.getReturnedType(); } diff --git a/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java index bf1acf4..c75423d 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java @@ -394,11 +394,16 @@ public abstract class AbstractR2dbcRepositoryIntegrationTests extends R2dbcInteg Mono existsByName(String name); } + public interface Buildable { + + String getName(); + } + @Getter @Setter @Table("legoset") @NoArgsConstructor - public static class LegoSet extends Lego { + public static class LegoSet extends Lego implements Buildable { String name; Integer manual; diff --git a/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java b/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java index 668c270..f515d3a 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java @@ -142,8 +142,19 @@ public class H2R2dbcRepositoryIntegrationTests extends AbstractR2dbcRepositoryIn }).verifyComplete(); } + @Test // gh-519 + public void shouldReturnEntityThroughInterface() { + + shouldInsertNewItems(); + + repository.findByName("SCHAUFELRADBAGGER").map(Buildable::getName).as(StepVerifier::create) + .expectNext("SCHAUFELRADBAGGER").verifyComplete(); + } + interface H2LegoSetRepository extends LegoSetRepository { + Mono findByName(String name); + @Query("SELECT MAX(manual) FROM legoset WHERE name = :name") Mono findMax(String name);