DATAJPA-1652 - Support for operators to directly follow named parameters.

Since `\P{P}` doesn't include things like `<`, `>`, or `|` those where considered part of the parameter name when they weren't separated from it by whitespace.
This is now fixed.

Original pull request: #405.
This commit is contained in:
reta
2019-12-28 16:48:06 -05:00
committed by Jens Schauder
parent e27933455e
commit 60241e7757
2 changed files with 32 additions and 2 deletions

View File

@@ -79,6 +79,7 @@ import org.springframework.util.StringUtils;
* @author Florian Lüdiger
* @author Grégoire Druant
* @author Mohammad Hewedy
* @author Andriy Redko
*/
public abstract class QueryUtils {
@@ -89,8 +90,8 @@ public abstract class QueryUtils {
// Z Separator
// Cc Control
// Cf Format
// P Punctuation
private static final String IDENTIFIER = "[._[\\P{Z}&&\\P{Cc}&&\\P{Cf}&&\\P{P}]]+";
// Punct Punctuation
private static final String IDENTIFIER = "[._$[\\P{Z}&&\\P{Cc}&&\\P{Cf}&&\\P{Punct}]]+";
static final String COLON_NO_DOUBLE_COLON = "(?<![:\\\\]):";
static final String IDENTIFIER_GROUP = String.format("(%s)", IDENTIFIER);

View File

@@ -37,6 +37,7 @@ import org.springframework.data.repository.query.parser.Part.Type;
* @author Thomas Darimont
* @author Jens Schauder
* @author Nils Borrmann
* @author Andriy Redko
*/
public class StringQueryUnitTests {
@@ -540,6 +541,34 @@ public class StringQueryUnitTests {
softly.assertAll();
}
@Test // DATAJPA-1652
public void usingPipesWithNamedParameter() {
String queryString = "SELECT u FROM User u WHERE u.lastname LIKE '%'||:name||'%'";
StringQuery query = new StringQuery(queryString);
softly.assertThat(query.getQueryString()).isEqualTo(queryString);
softly.assertThat(query.hasParameterBindings()).isTrue();
softly.assertThat(query.getParameterBindings()).hasSize(1);
softly.assertThat(query.getParameterBindings().get(0).getName()).isEqualTo("name");
softly.assertAll();
}
@Test // DATAJPA-1652
public void usingGreaterThanWithNamedParameter() {
String queryString = "SELECT u FROM User u WHERE :age>u.age";
StringQuery query = new StringQuery(queryString);
softly.assertThat(query.getQueryString()).isEqualTo(queryString);
softly.assertThat(query.hasParameterBindings()).isTrue();
softly.assertThat(query.getParameterBindings()).hasSize(1);
softly.assertThat(query.getParameterBindings().get(0).getName()).isEqualTo("age");
softly.assertAll();
}
public void checkNumberOfNamedParameters(String query, int expectedSize, String label) {
DeclaredQuery declaredQuery = DeclaredQuery.of(query);