From 6cc838a3f8d5933725be0c646b84bb2a9a9e0901 Mon Sep 17 00:00:00 2001 From: Oliver Wehrens Date: Sun, 13 Apr 2014 15:20:00 +0200 Subject: [PATCH] DATAJPA-513 - Improve error message on missing @Param on query method parameter. StringQuery now hints to the usage of @Param on query method parameters if named parameters are used and parameter names were not declared. Original pull request: #77. --- .../jpa/repository/query/StringQuery.java | 5 ++++- .../query/StringQueryUnitTests.java | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java b/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java index f26eeedaa..eef1ce951 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java @@ -36,9 +36,12 @@ import org.springframework.util.StringUtils; * * @author Oliver Gierke * @author Thomas Darimont + * @author Oliver Wehrens */ class StringQuery { + private static final String PARAMETER_NAME_MISSING = "Name for parameter binding must not be null or empty! For named parameters you need to use @Param for query method parameters on Java versions < 8."; + private final String query; private final List bindings; private final String alias; @@ -102,7 +105,7 @@ class StringQuery { */ public ParameterBinding getBindingFor(String name) { - Assert.hasText(name, "Name must not be null or empty!"); + Assert.hasText(name, PARAMETER_NAME_MISSING); for (ParameterBinding binding : bindings) { if (binding.hasName(name)) { diff --git a/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java index 4cf2f5931..6db2514a4 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java @@ -20,10 +20,13 @@ import static org.junit.Assert.*; import java.util.List; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.springframework.data.jpa.repository.query.StringQuery.InParameterBinding; import org.springframework.data.jpa.repository.query.StringQuery.LikeParameterBinding; import org.springframework.data.jpa.repository.query.StringQuery.ParameterBinding; +import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.parser.Part.Type; /** @@ -34,6 +37,8 @@ import org.springframework.data.repository.query.parser.Part.Type; */ public class StringQueryUnitTests { + public @Rule ExpectedException exception = ExpectedException.none(); + /** * @see DATAJPA-341 */ @@ -227,6 +232,20 @@ public class StringQueryUnitTests { assertNamedBinding(InParameterBinding.class, "statuses", bindings.get(0)); } + /** + * @see DATAJPA-513 + */ + @Test + public void rejectsNullParameterNameHintingTowardsAtParamForNullParameterName() { + + StringQuery query = new StringQuery("select x from X"); + + exception.expect(IllegalArgumentException.class); + exception.expectMessage(Param.class.getSimpleName()); + + query.getBindingFor(null); + } + private void assertPositionalBinding(Class bindingType, Integer position, ParameterBinding expectedBinding) {