17
17
18
18
import jakarta .persistence .EntityManager ;
19
19
import jakarta .persistence .EntityManagerFactory ;
20
+ import jakarta .persistence .PersistenceUnitUtil ;
20
21
import jakarta .persistence .metamodel .Metamodel ;
21
22
import jakarta .persistence .spi .PersistenceUnitInfo ;
22
23
23
24
import java .lang .reflect .Method ;
24
25
import java .util .Map ;
25
26
import java .util .Optional ;
27
+ import java .util .function .Function ;
26
28
27
29
import org .jspecify .annotations .Nullable ;
28
30
32
34
import org .springframework .core .annotation .MergedAnnotation ;
33
35
import org .springframework .core .annotation .MergedAnnotations ;
34
36
import org .springframework .data .jpa .provider .PersistenceProvider ;
37
+ import org .springframework .data .jpa .provider .QueryExtractor ;
35
38
import org .springframework .data .jpa .repository .EntityGraph ;
36
39
import org .springframework .data .jpa .repository .Modifying ;
37
40
import org .springframework .data .jpa .repository .NativeQuery ;
38
41
import org .springframework .data .jpa .repository .Query ;
39
42
import org .springframework .data .jpa .repository .QueryHints ;
43
+ import org .springframework .data .jpa .repository .query .JpaEntityMetadata ;
40
44
import org .springframework .data .jpa .repository .query .JpaParameters ;
41
45
import org .springframework .data .jpa .repository .query .JpaQueryMethod ;
42
46
import org .springframework .data .jpa .repository .query .Procedure ;
43
47
import org .springframework .data .jpa .repository .query .QueryEnhancerSelector ;
48
+ import org .springframework .data .jpa .repository .support .JpaEntityInformationSupport ;
49
+ import org .springframework .data .projection .ProjectionFactory ;
44
50
import org .springframework .data .repository .aot .generate .AotRepositoryClassBuilder ;
45
51
import org .springframework .data .repository .aot .generate .AotRepositoryConstructorBuilder ;
46
52
import org .springframework .data .repository .aot .generate .MethodContributor ;
47
53
import org .springframework .data .repository .aot .generate .QueryMetadata ;
48
54
import org .springframework .data .repository .aot .generate .RepositoryContributor ;
49
55
import org .springframework .data .repository .config .AotRepositoryContext ;
56
+ import org .springframework .data .repository .core .RepositoryMetadata ;
50
57
import org .springframework .data .repository .core .support .RepositoryFactoryBeanSupport ;
58
+ import org .springframework .data .repository .query .ParametersSource ;
51
59
import org .springframework .data .repository .query .QueryMethod ;
52
60
import org .springframework .data .repository .query .ReturnedType ;
53
61
import org .springframework .data .util .TypeInformation ;
70
78
public class JpaRepositoryContributor extends RepositoryContributor {
71
79
72
80
private final Metamodel metamodel ;
81
+ private final PersistenceUnitUtil persistenceUnitUtil ;
73
82
private final PersistenceProvider persistenceProvider ;
74
83
private final QueriesFactory queriesFactory ;
75
84
private final EntityGraphLookup entityGraphLookup ;
@@ -88,28 +97,24 @@ public JpaRepositoryContributor(AotRepositoryContext repositoryContext, Persiste
88
97
}
89
98
90
99
public JpaRepositoryContributor (AotRepositoryContext repositoryContext , EntityManagerFactory entityManagerFactory ) {
91
- this (repositoryContext , entityManagerFactory .getMetamodel (),
92
- PersistenceProvider .fromEntityManagerFactory (entityManagerFactory ),
93
- new QueriesFactory (repositoryContext .getConfigurationSource (), entityManagerFactory ,
94
- repositoryContext .getRequiredClassLoader ()),
95
- new EntityGraphLookup (entityManagerFactory ));
100
+ this (repositoryContext , entityManagerFactory , entityManagerFactory .getMetamodel ());
96
101
}
97
102
98
103
private JpaRepositoryContributor (AotRepositoryContext repositoryContext , AotMetamodel metamodel ) {
99
- this (repositoryContext , metamodel ,
100
- PersistenceProvider .fromEntityManagerFactory (metamodel .getEntityManagerFactory ()),
101
- new QueriesFactory (repositoryContext .getConfigurationSource (), metamodel .getEntityManagerFactory (),
102
- repositoryContext .getRequiredClassLoader ()),
103
- new EntityGraphLookup (metamodel .getEntityManagerFactory ()));
104
+ this (repositoryContext , metamodel .getEntityManagerFactory (), metamodel );
104
105
}
105
106
106
- private JpaRepositoryContributor (AotRepositoryContext repositoryContext , Metamodel metamodel ,
107
- PersistenceProvider persistenceProvider , QueriesFactory queriesFactory , EntityGraphLookup entityGraphLookup ) {
107
+ private JpaRepositoryContributor (AotRepositoryContext repositoryContext , EntityManagerFactory entityManagerFactory ,
108
+ Metamodel metamodel ) {
109
+
108
110
super (repositoryContext );
111
+
109
112
this .metamodel = metamodel ;
110
- this .persistenceProvider = persistenceProvider ;
111
- this .queriesFactory = queriesFactory ;
112
- this .entityGraphLookup = entityGraphLookup ;
113
+ this .persistenceUnitUtil = entityManagerFactory .getPersistenceUnitUtil ();
114
+ this .persistenceProvider = PersistenceProvider .fromEntityManagerFactory (entityManagerFactory );
115
+ this .queriesFactory = new QueriesFactory (repositoryContext .getConfigurationSource (), entityManagerFactory ,
116
+ repositoryContext .getRequiredClassLoader ());
117
+ this .entityGraphLookup = new EntityGraphLookup (entityManagerFactory );
113
118
this .context = repositoryContext ;
114
119
}
115
120
@@ -159,8 +164,10 @@ private Optional<Class<QueryEnhancerSelector>> getQueryEnhancerSelectorClass() {
159
164
@ Override
160
165
protected @ Nullable MethodContributor <? extends QueryMethod > contributeQueryMethod (Method method ) {
161
166
162
- JpaQueryMethod queryMethod = new JpaQueryMethod (method , getRepositoryInformation (), getProjectionFactory (),
163
- persistenceProvider );
167
+ JpaEntityMetadata <?> entityInformation = JpaEntityInformationSupport
168
+ .getEntityInformation (getRepositoryInformation ().getDomainType (), metamodel , persistenceUnitUtil );
169
+ AotJpaQueryMethod queryMethod = new AotJpaQueryMethod (method , getRepositoryInformation (), entityInformation ,
170
+ getProjectionFactory (), persistenceProvider , JpaParameters ::new );
164
171
165
172
Optional <Class <QueryEnhancerSelector >> queryEnhancerSelectorClass = getQueryEnhancerSelectorClass ();
166
173
QueryEnhancerSelector selector = queryEnhancerSelectorClass .map (BeanUtils ::instantiateClass )
@@ -271,4 +278,27 @@ public Map<String, Object> serialize() {
271
278
}
272
279
}
273
280
281
+ /**
282
+ * AOT extension to {@link JpaQueryMethod} providing a metamodel backed {@link JpaEntityMetadata} object.
283
+ */
284
+ static class AotJpaQueryMethod extends JpaQueryMethod {
285
+
286
+ private final JpaEntityMetadata <?> entityMetadata ;
287
+
288
+ public AotJpaQueryMethod (Method method , RepositoryMetadata metadata , JpaEntityMetadata <?> entityMetadata ,
289
+ ProjectionFactory factory , QueryExtractor extractor ,
290
+ Function <ParametersSource , JpaParameters > parametersFunction ) {
291
+
292
+ super (method , metadata , factory , extractor , parametersFunction );
293
+
294
+ this .entityMetadata = entityMetadata ;
295
+ }
296
+
297
+ @ Override
298
+ public JpaEntityMetadata <?> getEntityInformation () {
299
+ return this .entityMetadata ;
300
+ }
301
+
302
+ }
303
+
274
304
}
0 commit comments