From d79a4014256774b65c60a3559e0512623851e08b 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 06230fdb..96955c0e 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 bf1acf41..c75423d1 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 668c2709..f515d3a9 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);