Skip to content

Commit c745165

Browse files
committed
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
1 parent cecad1c commit c745165

File tree

3 files changed

+21
-1
lines changed

3 files changed

+21
-1
lines changed

src/main/java/org/springframework/data/r2dbc/repository/query/AbstractR2dbcQuery.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,10 @@ Class<?> resolveResultType(ResultProcessor resultProcessor) {
129129

130130
ReturnedType returnedType = resultProcessor.getReturnedType();
131131

132+
if (returnedType.getReturnedType().isAssignableFrom(returnedType.getDomainType())) {
133+
return returnedType.getDomainType();
134+
}
135+
132136
return returnedType.isProjecting() ? returnedType.getDomainType() : returnedType.getReturnedType();
133137
}
134138

src/test/java/org/springframework/data/r2dbc/repository/AbstractR2dbcRepositoryIntegrationTests.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,11 +394,16 @@ interface LegoSetRepository extends ReactiveCrudRepository<LegoSet, Integer> {
394394
Mono<Boolean> existsByName(String name);
395395
}
396396

397+
public interface Buildable {
398+
399+
String getName();
400+
}
401+
397402
@Getter
398403
@Setter
399404
@Table("legoset")
400405
@NoArgsConstructor
401-
public static class LegoSet extends Lego {
406+
public static class LegoSet extends Lego implements Buildable {
402407
String name;
403408
Integer manual;
404409

src/test/java/org/springframework/data/r2dbc/repository/H2R2dbcRepositoryIntegrationTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,19 @@ public void shouldInsertIdOnlyEntity() {
142142
}).verifyComplete();
143143
}
144144

145+
@Test // gh-519
146+
public void shouldReturnEntityThroughInterface() {
147+
148+
shouldInsertNewItems();
149+
150+
repository.findByName("SCHAUFELRADBAGGER").map(Buildable::getName).as(StepVerifier::create)
151+
.expectNext("SCHAUFELRADBAGGER").verifyComplete();
152+
}
153+
145154
interface H2LegoSetRepository extends LegoSetRepository {
146155

156+
Mono<Buildable> findByName(String name);
157+
147158
@Query("SELECT MAX(manual) FROM legoset WHERE name = :name")
148159
Mono<Integer> findMax(String name);
149160

0 commit comments

Comments
 (0)