Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 72fae93

Browse files
committed
fix type information when using dinamic projection and generic repository
1 parent 15aa62d commit 72fae93

File tree

4 files changed

+77
-37
lines changed

4 files changed

+77
-37
lines changed
Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,39 @@
11
package com.cosium.spring.data.jpa.entity.graph.repository.query;
22

33
import com.cosium.spring.data.jpa.entity.graph.domain2.EntityGraph;
4-
import java.lang.reflect.Method;
54
import org.springframework.core.MethodParameter;
65
import org.springframework.data.jpa.repository.query.JpaParameters;
6+
import org.springframework.data.repository.query.ParametersSource;
7+
import org.springframework.data.util.TypeInformation;
78

89
/**
910
* @author Réda Housni Alaoui
1011
*/
1112
class EntityGraphAwareJpaParameters extends JpaParameters {
1213

13-
public EntityGraphAwareJpaParameters(Method method) {
14-
super(method);
15-
}
16-
17-
@Override
18-
protected JpaParameter createParameter(MethodParameter parameter) {
19-
return new EntityGraphAwareJpaParameter(parameter);
20-
}
14+
public EntityGraphAwareJpaParameters(ParametersSource parametersSource) {
15+
super(parametersSource, methodParameter ->
16+
new EntityGraphAwareJpaParameter(methodParameter, parametersSource.getDomainTypeInformation())
17+
);
18+
}
2119

22-
private static class EntityGraphAwareJpaParameter extends JpaParameters.JpaParameter {
20+
private static class EntityGraphAwareJpaParameter extends JpaParameters.JpaParameter {
2321

24-
private final boolean entityGraph;
22+
private final boolean entityGraph;
2523

26-
protectedEntityGraphAwareJpaParameter(MethodParameter parameter) {
27-
super(parameter);
28-
this.entityGraph = EntityGraph.class.isAssignableFrom(parameter.getParameterType());
29-
}
24+
privateEntityGraphAwareJpaParameter(MethodParameter parameter, TypeInformation<?> domainType) {
25+
super(parameter, domainType);
26+
this.entityGraph = EntityGraph.class.isAssignableFrom(parameter.getParameterType());
27+
}
3028

31-
@Override
32-
public boolean isBindable() {
33-
return !entityGraph && super.isBindable();
34-
}
29+
@Override
30+
public boolean isBindable() {
31+
return !entityGraph && super.isBindable();
32+
}
3533

36-
@Override
37-
public boolean isSpecialParameter() {
38-
return entityGraph || super.isSpecialParameter();
34+
@Override
35+
public boolean isSpecialParameter() {
36+
return entityGraph || super.isSpecialParameter();
37+
}
3938
}
40-
}
4139
}
Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
package com.cosium.spring.data.jpa.entity.graph.repository.query;
22

3-
import java.lang.reflect.Method;
43
import org.springframework.data.jpa.provider.QueryExtractor;
5-
import org.springframework.data.jpa.repository.query.JpaParameters;
64
import org.springframework.data.jpa.repository.query.JpaQueryMethod;
75
import org.springframework.data.projection.ProjectionFactory;
86
import org.springframework.data.repository.core.RepositoryMetadata;
7+
import org.springframework.data.repository.query.Parameters;
8+
import org.springframework.data.repository.query.ParametersSource;
9+
10+
import java.lang.reflect.Method;
911

1012
/**
1113
* @author Réda Housni Alaoui
1214
*/
1315
class EntityGraphAwareJpaQueryMethod extends JpaQueryMethod {
1416

15-
protected EntityGraphAwareJpaQueryMethod(
16-
Method method,
17-
RepositoryMetadata metadata,
18-
ProjectionFactory factory,
19-
QueryExtractor extractor) {
20-
super(method, metadata, factory, extractor);
21-
}
17+
protected EntityGraphAwareJpaQueryMethod(
18+
Method method,
19+
RepositoryMetadata metadata,
20+
ProjectionFactory factory,
21+
QueryExtractor extractor) {
22+
super(method, metadata, factory, extractor);
23+
}
2224

23-
@Override
24-
protected JpaParameterscreateParameters(Methodmethod) {
25-
return new EntityGraphAwareJpaParameters(method);
26-
}
25+
@Override
26+
protected Parameters<?, ?> createParameters(ParametersSourceparametersSource) {
27+
return new EntityGraphAwareJpaParameters(parametersSource);
28+
}
2729
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.cosium.spring.data.jpa.entity.graph.repository;
2+
3+
import com.cosium.spring.data.jpa.entity.graph.BaseTest;
4+
import com.cosium.spring.data.jpa.entity.graph.sample.Brand;
5+
import com.github.springtestdbunit.annotation.DatabaseSetup;
6+
import jakarta.inject.Inject;
7+
import jakarta.transaction.Transactional;
8+
import org.junit.jupiter.api.DisplayName;
9+
import org.junit.jupiter.api.Test;
10+
import org.springframework.data.repository.NoRepositoryBean;
11+
import org.springframework.data.repository.Repository;
12+
13+
import java.io.Serializable;
14+
import java.util.Optional;
15+
16+
import static org.assertj.core.api.Assertions.assertThat;
17+
18+
@DatabaseSetup(BaseTest.DATASET)
19+
class DynamicProjectionRepositoryTest extends BaseTest {
20+
21+
@Inject
22+
private BrandRepository repository;
23+
24+
@Test
25+
@Transactional
26+
@DisplayName("dynamic projections should work when you have a super class with generics")
27+
void test1() {
28+
var result = repository.findById(1L, Brand.class);
29+
assertThat(result).map(Brand::getId).isPresent();
30+
31+
}
32+
33+
@NoRepositoryBean
34+
public interface EntityGraphBaseRepository<T, I extends Serializable> extends Repository<T, I> {
35+
<X> Optional<X> findById(I id, Class<X> clazz);
36+
}
37+
38+
@org.springframework.stereotype.Repository
39+
public interface BrandRepository extends EntityGraphBaseRepository<Brand, Long> {}
40+
}

‎pom.xml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
<properties>
2020
<maven.compiler.release>17</maven.compiler.release>
2121

22-
<spring.data.jpa>3.2.0</spring.data.jpa>
22+
<spring.data.jpa>3.2.1</spring.data.jpa>
2323
<querydsl>5.0.0</querydsl>
2424

2525
<dbunit>2.7.3</dbunit>

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /