28
28
import org .springframework .data .repository .core .RepositoryMetadata ;
29
29
import org .springframework .data .repository .query .QueryLookupStrategy ;
30
30
import org .springframework .data .repository .query .QueryLookupStrategy .Key ;
31
+ import org .springframework .data .repository .query .QueryMethod ;
31
32
import org .springframework .data .repository .query .QueryMethodEvaluationContextProvider ;
32
33
import org .springframework .data .repository .query .RepositoryQuery ;
33
34
import org .springframework .lang .Nullable ;
@@ -47,6 +48,11 @@ public final class JpaQueryLookupStrategy {
47
48
48
49
private static final Log LOG = LogFactory .getLog (JpaQueryLookupStrategy .class );
49
50
51
+ /**
52
+ * A null-value instance used to signal if no named or annotated query could be resolved.
53
+ */
54
+ private static final RepositoryQuery NO_NAMED_OR_ANNOTATED_QUERY = new NoNamedOrAnnotatedQuery ();
55
+
50
56
/**
51
57
* Private constructor to prevent instantiation.
52
58
*/
@@ -172,12 +178,9 @@ protected RepositoryQuery resolveQuery(JpaQueryMethod method, QueryRewriter quer
172
178
173
179
RepositoryQuery query = NamedQuery .lookupFrom (method , em );
174
180
175
- if (null != query ) {
176
- return query ;
177
- }
178
-
179
- throw new IllegalStateException (
180
- String .format ("Did neither find a NamedQuery nor an annotated query for method %s!" , method ));
181
+ return query != null //
182
+ ? query //
183
+ : NO_NAMED_OR_ANNOTATED_QUERY ;
181
184
}
182
185
183
186
@ Nullable
@@ -245,11 +248,13 @@ public CreateIfNotFoundQueryLookupStrategy(EntityManager em, JpaQueryMethodFacto
245
248
protected RepositoryQuery resolveQuery (JpaQueryMethod method , QueryRewriter queryRewriter , EntityManager em ,
246
249
NamedQueries namedQueries ) {
247
250
248
- try {
249
- return lookupStrategy . resolveQuery ( method , queryRewriter , em , namedQueries );
250
- } catch ( IllegalStateException e ) {
251
- return createStrategy . resolveQuery ( method , queryRewriter , em , namedQueries ) ;
251
+ RepositoryQuery lookupQuery = lookupStrategy . resolveQuery ( method , queryRewriter , em , namedQueries );
252
+
253
+ if ( lookupQuery != NO_NAMED_OR_ANNOTATED_QUERY ) {
254
+ return lookupQuery ;
252
255
}
256
+
257
+ return createStrategy .resolveQuery (method , queryRewriter , em , namedQueries );
253
258
}
254
259
}
255
260
@@ -284,4 +289,20 @@ public static QueryLookupStrategy create(EntityManager em, JpaQueryMethodFactory
284
289
throw new IllegalArgumentException (String .format ("Unsupported query lookup strategy %s!" , key ));
285
290
}
286
291
}
292
+
293
+ /**
294
+ * A null value type that represents the lack of a defined query.
295
+ */
296
+ private static class NoNamedOrAnnotatedQuery implements RepositoryQuery {
297
+
298
+ @ Override
299
+ public Object execute (Object [] parameters ) {
300
+ return null ;
301
+ }
302
+
303
+ @ Override
304
+ public QueryMethod getQueryMethod () {
305
+ return null ;
306
+ }
307
+ }
287
308
}
0 commit comments