2424import java .util .Collection ;
2525import java .util .List ;
2626import java .util .Optional ;
27+ import java .util .function .Supplier ;
2728import java .util .function .UnaryOperator ;
2829import java .util .stream .Stream ;
2930
3031import org .jspecify .annotations .Nullable ;
3132
33+ import org .springframework .beans .factory .BeanFactory ;
3234import org .springframework .core .CollectionFactory ;
3335import org .springframework .core .convert .ConversionService ;
3436import org .springframework .core .convert .support .ConfigurableConversionService ;
3739import org .springframework .data .domain .Sort ;
3840import org .springframework .data .expression .ValueEvaluationContextProvider ;
3941import org .springframework .data .expression .ValueExpression ;
42+ import org .springframework .data .jpa .repository .QueryRewriter ;
43+ import org .springframework .data .jpa .repository .query .BeanFactoryQueryRewriterProvider ;
4044import org .springframework .data .jpa .repository .query .DeclaredQuery ;
4145import org .springframework .data .jpa .repository .query .JpaParameters ;
4246import org .springframework .data .jpa .repository .query .JpaResultConverters ;
4347import org .springframework .data .jpa .repository .query .QueryEnhancer ;
4448import org .springframework .data .jpa .repository .query .QueryEnhancerSelector ;
49+ import org .springframework .data .jpa .repository .query .QueryRewriterProvider ;
4550import org .springframework .data .jpa .util .TupleBackedMap ;
4651import org .springframework .data .projection .ProjectionFactory ;
4752import org .springframework .data .repository .core .RepositoryMetadata ;
5661 * Support class for JPA AOT repository fragments.
5762 *
5863 * @author Mark Paluch
64+ * @author YeongJae Min
5965 * @since 4.0
6066 */
6167public class AotRepositoryFragmentSupport {
@@ -85,18 +91,33 @@ public class AotRepositoryFragmentSupport {
8591
8692 private final Lazy <ConcurrentLruCache <Method , ValueEvaluationContextProvider >> contextProviders ;
8793
94+ private final QueryRewriterProvider queryRewriterProvider ;
95+
8896 protected AotRepositoryFragmentSupport (QueryEnhancerSelector selector ,
8997 RepositoryFactoryBeanSupport .FragmentCreationContext context ) {
9098 this (selector , context .getRepositoryMetadata (), context .getValueExpressionDelegate (),
9199 context .getProjectionFactory ());
92100 }
93101
102+ protected AotRepositoryFragmentSupport (QueryEnhancerSelector selector ,
103+ RepositoryFactoryBeanSupport .FragmentCreationContext context , BeanFactory beanFactory ) {
104+ this (selector , context .getRepositoryMetadata (), context .getValueExpressionDelegate (), context .getProjectionFactory (),
105+ new BeanFactoryQueryRewriterProvider (beanFactory ));
106+ }
107+
94108 protected AotRepositoryFragmentSupport (QueryEnhancerSelector selector , RepositoryMetadata repositoryMetadata ,
95109 ValueExpressionDelegate valueExpressions , ProjectionFactory projectionFactory ) {
110+ this (selector , repositoryMetadata , valueExpressions , projectionFactory , QueryRewriterProvider .simple ());
111+ }
112+
113+ private AotRepositoryFragmentSupport (QueryEnhancerSelector selector , RepositoryMetadata repositoryMetadata ,
114+ ValueExpressionDelegate valueExpressions , ProjectionFactory projectionFactory ,
115+ QueryRewriterProvider queryRewriterProvider ) {
96116
97117 this .repositoryMetadata = repositoryMetadata ;
98118 this .valueExpressions = valueExpressions ;
99119 this .projectionFactory = projectionFactory ;
120+ this .queryRewriterProvider = queryRewriterProvider ;
100121 this .enhancers = Lazy .of (() -> new ConcurrentLruCache <>(32 , query -> selector .select (query ).create (query )));
101122 this .expressions = Lazy .of (() -> new ConcurrentLruCache <>(32 , valueExpressions ::parse ));
102123 this .contextProviders = Lazy .of (() -> new ConcurrentLruCache <>(32 , it -> valueExpressions
@@ -118,6 +139,15 @@ protected String rewriteQuery(DeclaredQuery query, Sort sort, Class<?> returnedT
118139 ReturnedType .of (returnedType , repositoryMetadata .getDomainType (), projectionFactory )));
119140 }
120141
142+ protected QueryRewriter getQueryRewriter (Class <? extends QueryRewriter > queryRewriter ) {
143+ return this .queryRewriterProvider .getQueryRewriter (queryRewriter );
144+ }
145+
146+ protected QueryRewriter getQueryRewriter (Class <? extends QueryRewriter > queryRewriter ,
147+ Supplier <QueryRewriter > fallback ) {
148+ return this .queryRewriterProvider .getQueryRewriter (queryRewriter , fallback );
149+ }
150+
121151 /**
122152 * Evaluate a Value Expression.
123153 *
0 commit comments