Skip to content

Commit a418fd2

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 908f17b commit a418fd2

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
@@ -122,6 +122,10 @@ private Class<?> resolveResultType(ResultProcessor resultProcessor) {
122122

123123
ReturnedType returnedType = resultProcessor.getReturnedType();
124124

125+
if (returnedType.getReturnedType().isAssignableFrom(returnedType.getDomainType())) {
126+
return returnedType.getDomainType();
127+
}
128+
125129
return returnedType.isProjecting() ? returnedType.getDomainType() : returnedType.getReturnedType();
126130
}
127131

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,11 +347,16 @@ interface LegoSetRepository extends ReactiveCrudRepository<LegoSet, Integer> {
347347
Mono<Integer> countByNameContains(String namePart);
348348
}
349349

350+
public interface Buildable {
351+
352+
String getName();
353+
}
354+
350355
@Getter
351356
@Setter
352357
@Table("legoset")
353358
@NoArgsConstructor
354-
static class LegoSet extends Lego {
359+
static class LegoSet extends Lego implements Buildable {
355360
String name;
356361
Integer manual;
357362

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,19 @@ public void shouldInsertIdOnlyEntity() {
137137
}).verifyComplete();
138138
}
139139

140+
@Test // gh-519
141+
public void shouldReturnEntityThroughInterface() {
142+
143+
shouldInsertNewItems();
144+
145+
repository.findByName("SCHAUFELRADBAGGER").map(Buildable::getName).as(StepVerifier::create)
146+
.expectNext("SCHAUFELRADBAGGER").verifyComplete();
147+
}
148+
140149
interface H2LegoSetRepository extends LegoSetRepository {
141150

151+
Mono<Buildable> findByName(String name);
152+
142153
@Override
143154
@Query("SELECT name FROM legoset")
144155
Flux<Named> findAsProjection();

0 commit comments

Comments
 (0)