From 09b6a4914661981156acbabeca2a35f64a2ec974 Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Fri, 4 Jul 2014 09:12:58 +0200 Subject: [PATCH] DATAJPA-564 - Removed support for SpEL expressions in derived queries. We came to the conclusion that allowing SpEL expressions as parameters in derived queries would create incentives for users to mess with the low-level Expressions API in high level user code. Therefore we decided to remove this feature - for now. --- .../query/CriteriaQueryParameterBinder.java | 13 +++++-------- .../query/JpaQueryLookupStrategy.java | 2 +- .../repository/query/PartTreeJpaQuery.java | 19 +------------------ .../jpa/repository/UserRepositoryTests.java | 17 ----------------- .../jpa/repository/sample/UserRepository.java | 6 ------ 5 files changed, 7 insertions(+), 50 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/CriteriaQueryParameterBinder.java b/src/main/java/org/springframework/data/jpa/repository/query/CriteriaQueryParameterBinder.java index 249c7fc62..3955ab605 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/CriteriaQueryParameterBinder.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/CriteriaQueryParameterBinder.java @@ -20,21 +20,20 @@ import java.util.Iterator; import javax.persistence.Parameter; import javax.persistence.Query; +import javax.persistence.criteria.CriteriaQuery; import org.springframework.data.jpa.repository.query.JpaParameters.JpaParameter; import org.springframework.data.jpa.repository.query.ParameterMetadataProvider.ParameterMetadata; -import org.springframework.data.jpa.repository.support.ExpressionEvaluationContextProvider; import org.springframework.data.repository.query.Parameters; import org.springframework.util.Assert; /** - * Special {@link ParameterBinder} that uses {@link javax.persistence.criteria.ParameterExpression}s to bind query - * parameters. + * Special {@link ParameterBinder} to bind {@link CriteriaQuery} parameters. parameters. * * @author Oliver Gierke * @author Thomas Darimont */ -class CriteriaQueryParameterBinder extends ExpressionAwareParameterBinder { +class CriteriaQueryParameterBinder extends ParameterBinder { private final Iterator> expressions; @@ -45,12 +44,10 @@ class CriteriaQueryParameterBinder extends ExpressionAwareParameterBinder { * @param parameters * @param values * @param expressions - * @param evaluationContextProvider */ - CriteriaQueryParameterBinder(JpaParameters parameters, Object[] values, Iterable> expressions, - ExpressionEvaluationContextProvider evaluationContextProvider) { + CriteriaQueryParameterBinder(JpaParameters parameters, Object[] values, Iterable> expressions) { - super(parameters, values, evaluationContextProvider); + super(parameters, values); Assert.notNull(expressions); this.expressions = expressions.iterator(); } diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategy.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategy.java index 8ea71d398..fc682afff 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategy.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryLookupStrategy.java @@ -93,7 +93,7 @@ public final class JpaQueryLookupStrategy { protected RepositoryQuery resolveQuery(JpaQueryMethod method, EntityManager em, NamedQueries namedQueries) { try { - return new PartTreeJpaQuery(method, em, this.evaluationContextProvider); + return new PartTreeJpaQuery(method, em); } catch (IllegalArgumentException e) { throw new IllegalArgumentException(String.format("Could not create query metamodel for method %s!", method.toString()), e); diff --git a/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java b/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java index 2236c79d4..32546aeed 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/PartTreeJpaQuery.java @@ -26,8 +26,6 @@ import javax.persistence.criteria.CriteriaQuery; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.query.JpaQueryExecution.DeleteExecution; import org.springframework.data.jpa.repository.query.ParameterMetadataProvider.ParameterMetadata; -import org.springframework.data.jpa.repository.support.ExpressionEvaluationContextProvider; -import org.springframework.data.jpa.repository.support.StandardExpressionEvaluationContextProvider; import org.springframework.data.repository.query.ParametersParameterAccessor; import org.springframework.data.repository.query.parser.PartTree; @@ -46,7 +44,6 @@ public class PartTreeJpaQuery extends AbstractJpaQuery { private final QueryPreparer query; private final QueryPreparer countQuery; private final EntityManager em; - private final ExpressionEvaluationContextProvider evaluationContextProvider; /** * Creates a new {@link PartTreeJpaQuery}. @@ -56,22 +53,8 @@ public class PartTreeJpaQuery extends AbstractJpaQuery { */ public PartTreeJpaQuery(JpaQueryMethod method, EntityManager em) { - this(method, em, StandardExpressionEvaluationContextProvider.INSTANCE); - } - - /** - * Creates a new {@link PartTreeJpaQuery}. - * - * @param method must not be {@literal null}. - * @param em must not be {@literal null}. - * @param evaluationContextProvider - */ - public PartTreeJpaQuery(JpaQueryMethod method, EntityManager em, - ExpressionEvaluationContextProvider evaluationContextProvider) { - super(method, em); this.em = em; - this.evaluationContextProvider = evaluationContextProvider; this.domainClass = method.getEntityInformation().getJavaType(); this.tree = new PartTree(method.getName(), domainClass); @@ -222,7 +205,7 @@ public class PartTreeJpaQuery extends AbstractJpaQuery { } private ParameterBinder getBinder(Object[] values, List> expressions) { - return new CriteriaQueryParameterBinder(parameters, values, expressions, evaluationContextProvider); + return new CriteriaQueryParameterBinder(parameters, values, expressions); } private Sort getDynamicSort(Object[] values) { diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index 5c8656ad8..fd01dd568 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -60,8 +60,6 @@ import org.springframework.data.jpa.domain.sample.SpecialUser; import org.springframework.data.jpa.domain.sample.User; import org.springframework.data.jpa.repository.SampleSecurity.SampleSecurityContextHolder; import org.springframework.data.jpa.repository.sample.UserRepository; -import org.springframework.expression.Expression; -import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.transaction.annotation.Transactional; @@ -1672,21 +1670,6 @@ public class UserRepositoryTests { assertThat(users.get(0), is(secondUser)); } - /** - * @see DATAJPA-564 - */ - @Test - public void shouldFindUserByLastnameWithSpelExpressionInDerivedQuery() { - - flushTestUsers(); - - Expression expr = new SpelExpressionParser().parseExpression("'Gier' + 'ke'"); - List users = repository.queryByLastname(expr); - - assertThat(users, hasSize(1)); - assertThat(users.get(0), is(firstUser)); - } - /** * @see DATAJPA-564 */ diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java index 8b4b80bf0..b1b2295c5 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java @@ -37,7 +37,6 @@ import org.springframework.data.jpa.repository.QueryHints; import org.springframework.data.jpa.repository.query.Procedure; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; -import org.springframework.expression.Expression; import org.springframework.transaction.annotation.Transactional; import com.google.common.base.Optional; @@ -473,11 +472,6 @@ public interface UserRepository extends JpaRepository, JpaSpecifi @Query("select u from User u where u.lastname like %:#{[0]}% and u.lastname like %:lastname%") List findByLastnameWithSpelExpression(@Param("lastname") String lastname); - /** - * @see DATAJPA-564 - */ - List queryByLastname(Expression lastname); - /** * @see DATAJPA-564 */