From a217fc4eeb152e82fdb0a4ad188da9344fb4476f Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Wed, 26 Jul 2023 15:13:22 -0500 Subject: [PATCH] Make SpEL behavior consistent. See #1597 --- .../query/ExpressionBasedStringQuery.java | 3 ++- .../ExpressionBasedStringQueryUnitTests.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ExpressionBasedStringQuery.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ExpressionBasedStringQuery.java index 837e22da2..3bee9c2d4 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ExpressionBasedStringQuery.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/ExpressionBasedStringQuery.java @@ -37,6 +37,7 @@ import org.springframework.util.Assert; * @author Tom Hombergs * @author Michael J. Simons * @author Diego Krupitza + * @author Greg Turnquist */ class ExpressionBasedStringQuery extends StringQuery { @@ -48,7 +49,7 @@ class ExpressionBasedStringQuery extends StringQuery { private static final String ENTITY_NAME = "entityName"; private static final String ENTITY_NAME_VARIABLE = "#" + ENTITY_NAME; - private static final String ENTITY_NAME_VARIABLE_EXPRESSION = "#{" + ENTITY_NAME_VARIABLE + "}"; + private static final String ENTITY_NAME_VARIABLE_EXPRESSION = "#{" + ENTITY_NAME_VARIABLE; /** * Creates a new {@link ExpressionBasedStringQuery} for the given query and {@link EntityMetadata}. diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/ExpressionBasedStringQueryUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/ExpressionBasedStringQueryUnitTests.java index 0a0226635..af1928d50 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/ExpressionBasedStringQueryUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/ExpressionBasedStringQueryUnitTests.java @@ -40,6 +40,7 @@ import org.springframework.expression.spel.standard.SpelExpressionParser; * @author Mark Paluch * @author Michael J. Simons * @author Diego Krupitza + * @author Greg Turnquist */ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) @@ -174,4 +175,30 @@ class ExpressionBasedStringQueryUnitTests { assertThat(binding.getType()).isEqualTo(Type.STARTING_WITH); } + @Test + public void doesTemplatingWhenEntityNameSpelIsPresent() { + + StringQuery query = new ExpressionBasedStringQuery("select #{#entityName + 'Hallo'} from #{#entityName} u", + metadata, SPEL_PARSER, false); + + assertThat(query.getQueryString()).isEqualTo("select UserHallo from User u"); + } + + @Test + public void doesNoTemplatingWhenEntityNameSpelIsNotPresent() { + + StringQuery query = new ExpressionBasedStringQuery("select #{#entityName + 'Hallo'} from User u", metadata, + SPEL_PARSER, false); + + assertThat(query.getQueryString()).isEqualTo("select UserHallo from User u"); + } + + @Test + public void doesTemplatingWhenEntityNameSpelIsPresentForBindParameter() { + + StringQuery query = new ExpressionBasedStringQuery("select u from #{#entityName} u where name = :#{#something}", + metadata, SPEL_PARSER, false); + + assertThat(query.getQueryString()).isEqualTo("select u from User u where name = :__$synthetic$__1"); + } }