1
1
package com .cosium .spring .data .jpa .entity .graph .repository .support ;
2
2
3
+ import static org .springframework .data .querydsl .QuerydslUtils .QUERY_DSL_PRESENT ;
4
+
3
5
import com .cosium .spring .data .jpa .entity .graph .domain .EntityGraph ;
6
+ import com .cosium .spring .data .jpa .entity .graph .repository .query .EntityGraphAwareJpaQueryMethodFactory ;
7
+ import javax .persistence .EntityManager ;
8
+ import org .springframework .data .jpa .provider .PersistenceProvider ;
4
9
import org .springframework .data .jpa .repository .support .JpaRepositoryFactory ;
5
10
import org .springframework .data .querydsl .QuerydslPredicateExecutor ;
6
11
import org .springframework .data .repository .core .RepositoryMetadata ;
7
- import org .springframework .data .repository .query .Parameter ;
8
- import org .springframework .data .repository .query .Parameters ;
9
- import org .springframework .util .ReflectionUtils ;
10
-
11
- import javax .persistence .EntityManager ;
12
- import java .lang .reflect .Field ;
13
- import java .lang .reflect .Modifier ;
14
- import java .util .ArrayList ;
15
- import java .util .List ;
16
-
17
- import static org .springframework .data .querydsl .QuerydslUtils .QUERY_DSL_PRESENT ;
18
12
19
13
/**
20
14
* This repository factory allows to build {@link EntityGraph} aware repositories. Created on
24
18
*/
25
19
public class EntityGraphJpaRepositoryFactory extends JpaRepositoryFactory {
26
20
27
- static {
28
- addEntityGraphToSpecialTypes ();
29
- }
30
-
31
21
/**
32
22
* Creates a new {@link JpaRepositoryFactory}.
33
23
*
@@ -36,34 +26,9 @@ public class EntityGraphJpaRepositoryFactory extends JpaRepositoryFactory {
36
26
public EntityGraphJpaRepositoryFactory (EntityManager entityManager ) {
37
27
super (entityManager );
38
28
addRepositoryProxyPostProcessor (new RepositoryMethodEntityGraphExtractor (entityManager ));
39
- }
40
-
41
- /**
42
- * Add {@link EntityGraph} to the special types.<br>
43
- * {@link EntityGraph} must be considered as a special type by Spring Data JPA.<br>
44
- * For this to occur, {@link EntityGraph} must be part of Spring Data JPA arrays storing special
45
- * types.<br>
46
- * Once a type is marked as special, Spring Data JPA will not try to bind it to an under
47
- * construction query.
48
- */
49
- private static void addEntityGraphToSpecialTypes () {
50
- addEntityGraphToSpecialTypes (Parameters .class , "TYPES" );
51
- addEntityGraphToSpecialTypes (Parameter .class , "TYPES" );
52
- }
53
-
54
- private static void addEntityGraphToSpecialTypes (Class <?> clazz , String fieldName ) {
55
- try {
56
- Field field = ReflectionUtils .findField (clazz , fieldName );
57
- field .setAccessible (true );
58
- Field modifiersField = Field .class .getDeclaredField ("modifiers" );
59
- modifiersField .setAccessible (true );
60
- modifiersField .setInt (field , field .getModifiers () & ~Modifier .FINAL );
61
- List <Class <?>> specialTypes = new ArrayList <Class <?>>((List <Class <?>>) field .get (null ));
62
- specialTypes .add (EntityGraph .class );
63
- ReflectionUtils .setField (field , null , specialTypes );
64
- } catch (Exception e ) {
65
- throw new RuntimeException (e .getMessage (), e );
66
- }
29
+ setQueryMethodFactory (
30
+ new EntityGraphAwareJpaQueryMethodFactory (
31
+ PersistenceProvider .fromEntityManager (entityManager )));
67
32
}
68
33
69
34
@ Override
0 commit comments