DATAJPA-628 - Use a shared SpelParser instead of recreating it.
We now use a shared SpelExpressionParser and propagate this through the String-based JpaRepositoryQuery implementations to avoid reinstantiations. Cleaned up ParameterBinder inheritance hierarchy by merging (and removing) ExpressionAwareParameterBinder into SpelExpressionStringQueryParameterBinder. Original pull request: #121.
This commit is contained in:
committed by
Oliver Gierke
parent
5c906ce73c
commit
0184c95a4b
@@ -23,6 +23,7 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.runners.MockitoJUnitRunner;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
|
||||
/**
|
||||
* Unit tests for {@link ExpressionBasedStringQuery}.
|
||||
@@ -35,6 +36,8 @@ public class ExpressionBasedStringQueryUnitTests {
|
||||
|
||||
@Mock JpaEntityMetadata<?> metadata;
|
||||
|
||||
static final SpelExpressionParser SPEL_PARSER = new SpelExpressionParser();
|
||||
|
||||
/**
|
||||
* @see DATAJPA-170
|
||||
*/
|
||||
@@ -44,7 +47,7 @@ public class ExpressionBasedStringQueryUnitTests {
|
||||
when(metadata.getEntityName()).thenReturn("User");
|
||||
|
||||
String source = "select from #{#entityName} u where u.firstname like :firstname";
|
||||
StringQuery query = new ExpressionBasedStringQuery(source, metadata);
|
||||
StringQuery query = new ExpressionBasedStringQuery(source, metadata, SPEL_PARSER);
|
||||
assertThat(query.getQueryString(), is("select from User u where u.firstname like :firstname"));
|
||||
}
|
||||
|
||||
@@ -56,7 +59,7 @@ public class ExpressionBasedStringQueryUnitTests {
|
||||
|
||||
when(metadata.getEntityName()).thenReturn("User");
|
||||
|
||||
StringQuery query = new ExpressionBasedStringQuery("select u from #{#entityName} u", metadata);
|
||||
StringQuery query = new ExpressionBasedStringQuery("select u from #{#entityName} u", metadata, SPEL_PARSER);
|
||||
assertThat(query.getAlias(), is("u"));
|
||||
assertThat(query.getQueryString(), is("select u from User u"));
|
||||
}
|
||||
|
||||
@@ -41,8 +41,9 @@ import org.springframework.data.repository.Repository;
|
||||
import org.springframework.data.repository.core.NamedQueries;
|
||||
import org.springframework.data.repository.core.RepositoryMetadata;
|
||||
import org.springframework.data.repository.core.support.DefaultRepositoryMetadata;
|
||||
import org.springframework.data.repository.query.QueryLookupStrategy;
|
||||
import org.springframework.data.repository.query.DefaultEvaluationContextProvider;
|
||||
import org.springframework.data.repository.query.EvaluationContextProvider;
|
||||
import org.springframework.data.repository.query.QueryLookupStrategy;
|
||||
import org.springframework.data.repository.query.QueryLookupStrategy.Key;
|
||||
|
||||
/**
|
||||
@@ -54,6 +55,7 @@ import org.springframework.data.repository.query.QueryLookupStrategy.Key;
|
||||
@RunWith(MockitoJUnitRunner.class)
|
||||
public class JpaQueryLookupStrategyUnitTests {
|
||||
|
||||
private static final EvaluationContextProvider EVALUATION_CONTEXT_PROVIDER = DefaultEvaluationContextProvider.INSTANCE;
|
||||
@Mock EntityManager em;
|
||||
@Mock EntityManagerFactory emf;
|
||||
@Mock QueryExtractor extractor;
|
||||
@@ -75,7 +77,7 @@ public class JpaQueryLookupStrategyUnitTests {
|
||||
public void invalidAnnotatedQueryCausesException() throws Exception {
|
||||
|
||||
QueryLookupStrategy strategy = JpaQueryLookupStrategy.create(em, Key.CREATE_IF_NOT_FOUND, extractor,
|
||||
DefaultEvaluationContextProvider.INSTANCE);
|
||||
EVALUATION_CONTEXT_PROVIDER);
|
||||
Method method = UserRepository.class.getMethod("findByFoo", String.class);
|
||||
RepositoryMetadata metadata = new DefaultRepositoryMetadata(UserRepository.class);
|
||||
|
||||
@@ -97,7 +99,7 @@ public class JpaQueryLookupStrategyUnitTests {
|
||||
public void sholdThrowMorePreciseExceptionIfTryingToUsePaginationInNativeQueries() throws Exception {
|
||||
|
||||
QueryLookupStrategy strategy = JpaQueryLookupStrategy.create(em, Key.CREATE_IF_NOT_FOUND, extractor,
|
||||
DefaultEvaluationContextProvider.INSTANCE);
|
||||
EVALUATION_CONTEXT_PROVIDER);
|
||||
Method method = UserRepository.class.getMethod("findByInvalidNativeQuery", String.class, Pageable.class);
|
||||
RepositoryMetadata metadata = new DefaultRepositoryMetadata(UserRepository.class);
|
||||
|
||||
|
||||
@@ -44,8 +44,10 @@ import org.springframework.data.jpa.provider.QueryExtractor;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.jpa.repository.sample.UserRepository;
|
||||
import org.springframework.data.repository.core.RepositoryMetadata;
|
||||
import org.springframework.data.repository.query.RepositoryQuery;
|
||||
import org.springframework.data.repository.query.DefaultEvaluationContextProvider;
|
||||
import org.springframework.data.repository.query.EvaluationContextProvider;
|
||||
import org.springframework.data.repository.query.RepositoryQuery;
|
||||
import org.springframework.expression.spel.standard.SpelExpressionParser;
|
||||
|
||||
/**
|
||||
* Unit test for {@link SimpleJpaQuery}.
|
||||
@@ -57,6 +59,8 @@ import org.springframework.data.repository.query.DefaultEvaluationContextProvide
|
||||
public class SimpleJpaQueryUnitTests {
|
||||
|
||||
static final String USER_QUERY = "select u from User u";
|
||||
static final SpelExpressionParser PARSER = new SpelExpressionParser();
|
||||
private static final EvaluationContextProvider EVALUATION_CONTEXT_PROVIDER = DefaultEvaluationContextProvider.INSTANCE;
|
||||
|
||||
JpaQueryMethod method;
|
||||
|
||||
@@ -95,8 +99,8 @@ public class SimpleJpaQueryUnitTests {
|
||||
when(method.getEntityInformation()).thenReturn((JpaEntityMetadata) new DefaultJpaEntityMetadata<User>(User.class));
|
||||
when(em.createQuery("foo", Long.class)).thenReturn(query);
|
||||
|
||||
SimpleJpaQuery jpaQuery = new SimpleJpaQuery(method, em, "select u from User u",
|
||||
DefaultEvaluationContextProvider.INSTANCE);
|
||||
SimpleJpaQuery jpaQuery = new SimpleJpaQuery(method, em, "select u from User u", EVALUATION_CONTEXT_PROVIDER,
|
||||
PARSER);
|
||||
|
||||
assertThat(jpaQuery.createCountQuery(new Object[] {}), is(query));
|
||||
}
|
||||
@@ -113,7 +117,7 @@ public class SimpleJpaQueryUnitTests {
|
||||
JpaQueryMethod queryMethod = new JpaQueryMethod(method, metadata, extractor);
|
||||
|
||||
AbstractJpaQuery jpaQuery = new SimpleJpaQuery(queryMethod, em, "select u from User u",
|
||||
DefaultEvaluationContextProvider.INSTANCE);
|
||||
EVALUATION_CONTEXT_PROVIDER, PARSER);
|
||||
jpaQuery.createCountQuery(new Object[] { new PageRequest(1, 10) });
|
||||
|
||||
verify(query, times(0)).setFirstResult(anyInt());
|
||||
@@ -127,7 +131,7 @@ public class SimpleJpaQueryUnitTests {
|
||||
Method method = SampleRepository.class.getMethod("findNativeByLastname", String.class);
|
||||
JpaQueryMethod queryMethod = new JpaQueryMethod(method, metadata, extractor);
|
||||
AbstractJpaQuery jpaQuery = JpaQueryFactory.INSTANCE.fromQueryAnnotation(queryMethod, em,
|
||||
DefaultEvaluationContextProvider.INSTANCE);
|
||||
EVALUATION_CONTEXT_PROVIDER);
|
||||
|
||||
assertThat(jpaQuery instanceof NativeJpaQuery, is(true));
|
||||
|
||||
@@ -208,8 +212,7 @@ public class SimpleJpaQueryUnitTests {
|
||||
private RepositoryQuery createJpaQuery(Method method) {
|
||||
|
||||
JpaQueryMethod queryMethod = new JpaQueryMethod(method, metadata, extractor);
|
||||
return JpaQueryFactory.INSTANCE.fromQueryAnnotation(queryMethod, em,
|
||||
DefaultEvaluationContextProvider.INSTANCE);
|
||||
return JpaQueryFactory.INSTANCE.fromQueryAnnotation(queryMethod, em, EVALUATION_CONTEXT_PROVIDER);
|
||||
}
|
||||
|
||||
interface SampleRepository {
|
||||
|
||||
Reference in New Issue
Block a user