Skip to content

Improve QueryUtils.applyAndBind(…) to avoid StackOverflowError with many entities #2870

Closed
@ipavkovic

Description

@ipavkovic

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, ...)

https://github.com/spring-projects/spring-data-jpa/blob/main/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java#L522

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());

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions