DATAJPA-564 - More robust handling of SpEL expressions in String queries.

We now treat the result of the SpEL expression evaluation as Object instead of just String in ExpressionAwareParameterBinder. We now prefer index based parameter binding over named parameter binding iff only SpEL expression parameters are present. We now make named parameters available as variables in SpEL expressions.
This commit is contained in:
Thomas Darimont
2014-06-26 12:46:08 +02:00
committed by Oliver Gierke
parent a94a807bb3
commit b09588f922
5 changed files with 107 additions and 3 deletions

View File

@@ -1617,6 +1617,58 @@ public class UserRepositoryTests {
assertThat(users.get(0), is(firstUser));
}
/**
* @see DATAJPA-XXX
*/
@Test
public void shouldFindBySpELExpressionWithoutArgumentsWithQuestionmark() {
flushTestUsers();
List<User> users = repository.findOliverBySpELExpressionWithoutArgumentsWithQuestionmark();
assertThat(users, hasSize(1));
assertThat(users.get(0), is(firstUser));
}
/**
* @see DATAJPA-XXX
*/
@Test
public void shouldFindBySpELExpressionWithoutArgumentsWithColon() {
flushTestUsers();
List<User> users = repository.findOliverBySpELExpressionWithoutArgumentsWithColon();
assertThat(users, hasSize(1));
assertThat(users.get(0), is(firstUser));
}
/**
* @see DATAJPA-XXX
*/
@Test
public void shouldFindUsersByAgeForSpELExpression() {
flushTestUsers();
List<User> users = repository.findUsersByAgeForSpELExpressionByIndexedParameter(35);
assertThat(users, hasSize(1));
assertThat(users.get(0), is(secondUser));
}
/**
* @see DATAJPA-XXX
*/
@Test
public void shouldfindUsersByFirstnameForSpELExpressionWithParameterNameVariableReference() {
flushTestUsers();
List<User> users = repository.findUsersByFirstnameForSpELExpression("Joachim");
assertThat(users, hasSize(1));
assertThat(users.get(0), is(secondUser));
}
/**
* @see DATAJPA-XXX
*/

View File

@@ -477,4 +477,28 @@ public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecifi
* @see DATAJPA-XXX
*/
List<User> queryByLastname(Expression lastname);
/**
* @see DATAJPA-XXX
*/
@Query("select u from User u where u.firstname = ?#{'Oliver'}")
List<User> findOliverBySpELExpressionWithoutArgumentsWithQuestionmark();
/**
* @see DATAJPA-XXX
*/
@Query("select u from User u where u.firstname = :#{'Oliver'}")
List<User> findOliverBySpELExpressionWithoutArgumentsWithColon();
/**
* @see DATAJPA-XXX
*/
@Query("select u from User u where u.age = ?#{[0]}")
List<User> findUsersByAgeForSpELExpressionByIndexedParameter(int age);
/**
* @see DATAJPA-XXX
*/
@Query("select u from User u where u.firstname = :firstname and u.firstname = :#{#firstname}")
List<User> findUsersByFirstnameForSpELExpression(@Param("firstname") String firstname);
}