From d6f368dcfb804186e6c05094f2a5e101bdc0c553 Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Wed, 24 May 2023 14:36:46 -0500 Subject: [PATCH] Handle subqueries when used inside HQL INSERT statements. Potentialy subqueries can crop up inside INSERT statements. We need to handle this as well. NOTE: INSERT statements aren't defined in JPQL, so this problem doesn't overlap with standard JPA queries. See #2977 --- .../jpa/repository/query/HqlQueryTransformer.java | 2 ++ .../repository/query/HqlQueryTransformerTests.java | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryTransformer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryTransformer.java index 18a40573e..6afba0f1f 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryTransformer.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryTransformer.java @@ -96,6 +96,8 @@ class HqlQueryTransformer extends HqlQueryRenderer { return true; } else if (ctx instanceof HqlParser.SelectStatementContext) { return false; + } else if (ctx instanceof HqlParser.InsertStatementContext) { + return false; } else { return isSubquery(ctx.getParent()); } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java index 172be0489..e11dec1eb 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java @@ -973,6 +973,19 @@ class HqlQueryTransformerTests { .isEqualTo("FROM Story WHERE enabled = true order by created desc"); } + @Test // GH-2977 + void isSubqueryThrowsException() { + + String query = """ + insert into MyEntity (id, col) + select max(id), col + from MyEntityStaging + group by col + """; + + assertThat(createQueryFor(query, Sort.unsorted())).isEqualToIgnoringWhitespace(query); + } + private void assertCountQuery(String originalQuery, String countQuery) { assertThat(createCountQueryFor(originalQuery)).isEqualTo(countQuery); }