Skip to content

Commit f283b2e

Browse files
committed
Polishing.
Improve named query detection and query extraction for Eclipselink. See #3939
1 parent c1070bf commit f283b2e

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/provider/PersistenceProvider.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@
3535
import java.util.stream.Stream;
3636

3737
import org.eclipse.persistence.config.QueryHints;
38+
import org.eclipse.persistence.internal.queries.DatabaseQueryMechanism;
39+
import org.eclipse.persistence.internal.queries.JPQLCallQueryMechanism;
3840
import org.eclipse.persistence.jpa.JpaQuery;
41+
import org.eclipse.persistence.queries.DatabaseQuery;
3942
import org.eclipse.persistence.queries.ScrollableCursor;
4043
import org.hibernate.ScrollMode;
4144
import org.hibernate.ScrollableResults;
@@ -50,6 +53,7 @@
5053
import org.springframework.util.Assert;
5154
import org.springframework.util.ClassUtils;
5255
import org.springframework.util.ConcurrentReferenceHashMap;
56+
import org.springframework.util.StringUtils;
5357

5458
/**
5559
* Enumeration representing persistence providers to be used.
@@ -137,11 +141,37 @@ public long getResultCount(Query resultQuery, LongSupplier countSupplier) {
137141

138142
@Override
139143
public String extractQueryString(Object query) {
140-
return ((JpaQuery<?>) query).getDatabaseQuery().getJPQLString();
144+
145+
if (query instanceof JpaQuery<?> jpaQuery) {
146+
147+
DatabaseQuery databaseQuery = jpaQuery.getDatabaseQuery();
148+
149+
if (StringUtils.hasText(databaseQuery.getJPQLString())) {
150+
return databaseQuery.getJPQLString();
151+
}
152+
153+
if (StringUtils.hasText(databaseQuery.getSQLString())) {
154+
return databaseQuery.getSQLString();
155+
}
156+
}
157+
158+
return "";
141159
}
142160

143161
@Override
144162
public boolean isNativeQuery(Object query) {
163+
164+
if (query instanceof JpaQuery<?> jpaQuery) {
165+
166+
DatabaseQueryMechanism call = jpaQuery.getDatabaseQuery().getQueryMechanism();
167+
168+
if (call instanceof JPQLCallQueryMechanism) {
169+
return false;
170+
}
171+
172+
return true;
173+
}
174+
145175
return false;
146176
}
147177

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlOrderExpressionVisitor.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ public Expression<?> visitIsBooleanPredicate(HqlParser.IsBooleanPredicateContext
210210

211211
@Override
212212
public Expression<?> visitStringPatternMatching(HqlParser.StringPatternMatchingContext ctx) {
213+
213214
Expression<String> condition = visitRequired(ctx.expression(0));
214215
Expression<String> match = visitRequired(ctx.expression(1));
215216
Expression<Character> escape = ctx.ESCAPE() != null ? charLiteralOf(ctx.ESCAPE()) : null;
@@ -224,8 +225,10 @@ public Expression<?> visitStringPatternMatching(HqlParser.StringPatternMatchingC
224225
? cb.notLike(condition, match) //
225226
: cb.notLike(condition, match, escape);
226227
}
227-
} else {
228+
} else if (ctx.ILIKE() != null && cb instanceof HibernateCriteriaBuilder) {
229+
228230
HibernateCriteriaBuilder hcb = (HibernateCriteriaBuilder) cb;
231+
229232
if (ctx.NOT() == null) {
230233
return escape == null //
231234
? hcb.ilike(condition, match) //
@@ -235,6 +238,8 @@ public Expression<?> visitStringPatternMatching(HqlParser.StringPatternMatchingC
235238
? hcb.notIlike(condition, match) //
236239
: hcb.notIlike(condition, match, escape);
237240
}
241+
} else {
242+
throw new UnsupportedOperationException("Unsupported string pattern: " + ctx.getText());
238243
}
239244
}
240245

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/NamedQuery.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,17 +90,20 @@ private NamedQuery(JpaQueryMethod method, EntityManager em, JpaQueryConfiguratio
9090
throw QueryCreationException.create(method, CANNOT_EXTRACT_QUERY);
9191
}
9292

93+
boolean nativeQuery = method.isNativeQuery() || extractor.isNativeQuery(namedQuery);
94+
String queryString = extractor.extractQueryString(namedQuery);
95+
9396
if (parameters.hasPageableParameter()) {
97+
9498
LOG.warn(String.format(
9599
"Query method %s is backed by a NamedQuery but contains a Pageable parameter; Sorting delivered via this Pageable will not be applied; Use @%s(value=…) instead to apply sorting.",
96-
method, method.isNativeQuery() ? "NativeQuery" : "Query"));
100+
method, nativeQuery ? "NativeQuery" : "Query"));
97101
}
98102

99-
String queryString = extractor.extractQueryString(namedQuery);
100-
103+
// || namedQuery.toString().contains("NativeQuery")
101104
DeclaredQuery declaredQuery;
102105
if (StringUtils.hasText(queryString)) {
103-
if (method.isNativeQuery() || namedQuery.toString().contains("NativeQuery")) {
106+
if (nativeQuery) {
104107
declaredQuery = DeclaredQuery.nativeQuery(queryString);
105108
} else {
106109
declaredQuery = DeclaredQuery.jpqlQuery(queryString);

0 commit comments

Comments
 (0)