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.
This commit is contained in:
committed by
Oliver Gierke
parent
1879fea1f0
commit
09b6a49146
@@ -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<ParameterMetadata<?>> expressions;
|
||||
|
||||
@@ -45,12 +44,10 @@ class CriteriaQueryParameterBinder extends ExpressionAwareParameterBinder {
|
||||
* @param parameters
|
||||
* @param values
|
||||
* @param expressions
|
||||
* @param evaluationContextProvider
|
||||
*/
|
||||
CriteriaQueryParameterBinder(JpaParameters parameters, Object[] values, Iterable<ParameterMetadata<?>> expressions,
|
||||
ExpressionEvaluationContextProvider evaluationContextProvider) {
|
||||
CriteriaQueryParameterBinder(JpaParameters parameters, Object[] values, Iterable<ParameterMetadata<?>> expressions) {
|
||||
|
||||
super(parameters, values, evaluationContextProvider);
|
||||
super(parameters, values);
|
||||
Assert.notNull(expressions);
|
||||
this.expressions = expressions.iterator();
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<ParameterMetadata<?>> expressions) {
|
||||
return new CriteriaQueryParameterBinder(parameters, values, expressions, evaluationContextProvider);
|
||||
return new CriteriaQueryParameterBinder(parameters, values, expressions);
|
||||
}
|
||||
|
||||
private Sort getDynamicSort(Object[] values) {
|
||||
|
||||
@@ -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<User> users = repository.queryByLastname(expr);
|
||||
|
||||
assertThat(users, hasSize(1));
|
||||
assertThat(users.get(0), is(firstUser));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAJPA-564
|
||||
*/
|
||||
|
||||
@@ -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<User, Integer>, JpaSpecifi
|
||||
@Query("select u from User u where u.lastname like %:#{[0]}% and u.lastname like %:lastname%")
|
||||
List<User> findByLastnameWithSpelExpression(@Param("lastname") String lastname);
|
||||
|
||||
/**
|
||||
* @see DATAJPA-564
|
||||
*/
|
||||
List<User> queryByLastname(Expression lastname);
|
||||
|
||||
/**
|
||||
* @see DATAJPA-564
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user