From 26cda66de82fe4e075befb48bbd515fc159cb5ce Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Mon, 7 Jul 2014 23:13:04 +0200 Subject: [PATCH] DATAJPA-564 - Allow SpEL expressions to be the only consumer of query method parameters. Since eclipselink doesn't reliably report whether a given query contains parameter we try to set query-parameters via brute force in SESQPB. --- ...lExpressionStringQueryParameterBinder.java | 25 +++++++++++++++---- ...lipseLinkNamespaceUserRepositoryTests.java | 6 ----- .../OpenJpaNamespaceUserRepositoryTests.java | 2 +- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/SpelExpressionStringQueryParameterBinder.java b/src/main/java/org/springframework/data/jpa/repository/query/SpelExpressionStringQueryParameterBinder.java index 9aff5c62a..6bd016c1d 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/SpelExpressionStringQueryParameterBinder.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/SpelExpressionStringQueryParameterBinder.java @@ -63,7 +63,8 @@ class SpelExpressionStringQueryParameterBinder extends StringQueryParameterBinde */ private T potentiallyBindExpressionParameters(T jpaQuery) { - if (jpaQuery.getParameters().isEmpty()) { + if (isJpaParameterInformationReliable(jpaQuery) && jpaQuery.getParameters().isEmpty()) { + // We can rely on the fact there are no parameters in the given query. return jpaQuery; } @@ -75,14 +76,28 @@ class SpelExpressionStringQueryParameterBinder extends StringQueryParameterBinde Object value = evaluateExpression(expr); - if (binding.getName() != null) { - jpaQuery.setParameter(binding.getName(), binding.prepare(value)); - } else { - jpaQuery.setParameter(binding.getPosition(), binding.prepare(value)); + try { + if (binding.getName() != null) { + jpaQuery.setParameter(binding.getName(), binding.prepare(value)); + } else { + jpaQuery.setParameter(binding.getPosition(), binding.prepare(value)); + } + } catch (IllegalArgumentException iae) { + /* + * Since Eclipse doesn't reliably report whether a query has parameters + * we simply try to set the parameters and ignore possible failures. + * + */ } } } return jpaQuery; } + + private boolean isJpaParameterInformationReliable(T jpaQuery) { + + String className = jpaQuery.getClass().getName(); + return className.startsWith("org.apache.openjpa") || className.startsWith("org.hibernate"); + } } diff --git a/src/test/java/org/springframework/data/jpa/repository/EclipseLinkNamespaceUserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/EclipseLinkNamespaceUserRepositoryTests.java index abf516e75..d86e36b87 100644 --- a/src/test/java/org/springframework/data/jpa/repository/EclipseLinkNamespaceUserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/EclipseLinkNamespaceUserRepositoryTests.java @@ -74,10 +74,4 @@ public class EclipseLinkNamespaceUserRepositoryTests extends NamespaceUserReposi */ @Override public void findByElementCollectionAttribute() {} - - /** - * Temporarily ignored until issue with native queries and pagination is resolved. - */ - @Override - public void shouldFindUsersInNativeQueryWithPagination() {} } diff --git a/src/test/java/org/springframework/data/jpa/repository/OpenJpaNamespaceUserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/OpenJpaNamespaceUserRepositoryTests.java index 6c7c82515..56974e9fc 100644 --- a/src/test/java/org/springframework/data/jpa/repository/OpenJpaNamespaceUserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/OpenJpaNamespaceUserRepositoryTests.java @@ -89,7 +89,7 @@ public class OpenJpaNamespaceUserRepositoryTests extends NamespaceUserRepository } /** - * Temporarily ignored until issue with native queries and pagination is resolved. + * Temporarily ignored until openjpa works with hsqldb 2.x. */ @Override public void shouldFindUsersInNativeQueryWithPagination() {}