From a418fd2f92ca3ff317b60c6cac76c3d9ec3e170d 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 e5cf80b..35c2daa 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 @@ -122,6 +122,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 d0b8ab1..d36b5b4 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java @@ -347,11 +347,16 @@ public abstract class AbstractR2dbcRepositoryIntegrationTests extends R2dbcInteg Mono countByNameContains(String namePart); } + public interface Buildable { + + String getName(); + } + @Getter @Setter @Table("legoset") @NoArgsConstructor - static class LegoSet extends Lego { + 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 769bf5b..97396dc 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java @@ -137,8 +137,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); + @Override @Query("SELECT name FROM legoset") Flux findAsProjection();