18
18
import jakarta .persistence .EntityManager ;
19
19
import jakarta .persistence .Query ;
20
20
21
+ import java .lang .reflect .Constructor ;
22
+ import java .lang .reflect .InvocationTargetException ;
23
+
24
+ import org .springframework .data .domain .Sort ;
25
+ import org .springframework .data .jpa .repository .QueryRewriter ;
21
26
import org .springframework .data .repository .query .QueryMethodEvaluationContextProvider ;
22
27
import org .springframework .data .repository .query .ResultProcessor ;
23
28
import org .springframework .data .repository .query .ReturnedType ;
35
40
* @author David Madden
36
41
* @author Mark Paluch
37
42
* @author Diego Krupitza
43
+ * @author Greg Turnquist
38
44
*/
39
45
abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
40
46
@@ -43,6 +49,7 @@ abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
43
49
private final QueryMethodEvaluationContextProvider evaluationContextProvider ;
44
50
private final SpelExpressionParser parser ;
45
51
private final QueryParameterSetter .QueryMetadataCache metadataCache = new QueryParameterSetter .QueryMetadataCache ();
52
+ private final QueryRewriter queryRewriter ;
46
53
47
54
/**
48
55
* Creates a new {@link AbstractStringBasedJpaQuery} from the given {@link JpaQueryMethod}, {@link EntityManager} and
@@ -74,6 +81,7 @@ public AbstractStringBasedJpaQuery(JpaQueryMethod method, EntityManager em, Stri
74
81
method .isNativeQuery ());
75
82
76
83
this .parser = parser ;
84
+ this .queryRewriter = findQueryRewriter (method );
77
85
78
86
Assert .isTrue (method .isNativeQuery () || !query .usesJdbcStyleParameters (),
79
87
"JDBC style parameters (?) are not supported for JPA queries." );
@@ -148,7 +156,30 @@ protected Query createJpaQuery(String queryString, ReturnedType returnedType) {
148
156
Class <?> typeToRead = getTypeToRead (returnedType );
149
157
150
158
return typeToRead == null //
151
- ? em .createQuery (queryString ) //
152
- : em .createQuery (queryString , typeToRead );
159
+ ? em .createQuery (potentiallyRewriteQuery (queryString )) //
160
+ : em .createQuery (potentiallyRewriteQuery (queryString ), typeToRead );
161
+ }
162
+
163
+ @ Nullable
164
+ protected QueryRewriter findQueryRewriter (JpaQueryMethod method ) {
165
+
166
+ Class <? extends QueryRewriter > queryRewriter = method .getQueryRewriter ();
167
+
168
+ if (queryRewriter == null ) {
169
+ return null ;
170
+ }
171
+
172
+ try {
173
+ return (QueryRewriter ) ((Constructor <?>) queryRewriter .getDeclaredConstructor ()).newInstance ();
174
+ } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e ) {
175
+ System .out .println (e );
176
+ return null ;
177
+ }
178
+ }
179
+
180
+ protected String potentiallyRewriteQuery (String originalQuery ) {
181
+ return this .queryRewriter == null //
182
+ ? originalQuery //
183
+ : this .queryRewriter .rewrite (originalQuery , Sort .unsorted ());
153
184
}
154
185
}
0 commit comments