Closed
Description
While using SimpleJpaRepository.deleteAllInBatch method with about 500 entities I noticed that the called hibernate library tends to throw a StackOverflowError due to its antlr parsing nature.
To prevent this spring data jpa should not create an sql statement like
delete entity where alias =?1 OR alias =?2 OR ...
Instead, sql in should be used:
delete entity where alias in (?1, ?2, ...)
diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java
index f581f191..ce9a74b8 100644
--- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java
+++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java
@@ -533,7 +533,7 @@ public abstract class QueryUtils {
String alias = detectAlias(queryString);
StringBuilder builder = new StringBuilder(queryString);
- builder.append(" where");
+ builder.append(" where ").append(alias).append(" in (");
int i = 0;
@@ -541,12 +541,13 @@ public abstract class QueryUtils {
iterator.next();
- builder.append(String.format(" %s = ?%d", alias, ++i));
+ builder.append('?').append(++i);
if (iterator.hasNext()) {
- builder.append(" or");
+ builder.append(", ");
}
}
+ builder.append(")");
Query query = entityManager.createQuery(builder.toString());