DATAJPA-606 - Improve handling of empty arrays and collections in query parameters.
Introduced potentiallyConvertEmptyCollection method to PersistenceProvider for provider specific handling of empty collections. Special handling is performed for Hibernate and EclipseLink. Conversion is performed in ParameterMetadata.prepare(…). Renamed ParameterMetadataProvider.accessor to bindableParameterValues. Original pull request: #123.
This commit is contained in:
committed by
Oliver Gierke
parent
36a6f958f2
commit
3590075a46
@@ -1751,8 +1751,8 @@ public class UserRepositoryTests {
|
||||
assertThat(users.getContent(), hasSize(2));
|
||||
assertThat(users.getContent().get(0), is(thirdUser));
|
||||
assertThat(users.getContent().get(1), is(fourthUser));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAJPA-629
|
||||
*/
|
||||
@@ -1767,6 +1767,55 @@ public class UserRepositoryTests {
|
||||
assertThat(users.get(0), is(secondUser));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAJPA-606
|
||||
*/
|
||||
@Test
|
||||
public void findByEmptyCollectionOfStrings() throws Exception {
|
||||
|
||||
flushTestUsers();
|
||||
|
||||
List<User> users = repository.findByAttributesIn(new HashSet<String>());
|
||||
assertThat(users, hasSize(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAJPA-606
|
||||
*/
|
||||
@Test
|
||||
public void findByEmptyCollectionOfIntegers() throws Exception {
|
||||
|
||||
flushTestUsers();
|
||||
|
||||
List<User> users = repository.findByAgeIn(Arrays.<Integer> asList());
|
||||
assertThat(users, hasSize(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAJPA-606
|
||||
*/
|
||||
@Test
|
||||
public void findByEmptyArrayOfIntegers() throws Exception {
|
||||
|
||||
flushTestUsers();
|
||||
|
||||
List<User> users = repository.queryByAgeIn(new Integer[0]);
|
||||
assertThat(users, hasSize(0));
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATAJPA-606
|
||||
*/
|
||||
@Test
|
||||
public void findByAgeWithEmptyArrayOfIntegersOrFirstName() {
|
||||
|
||||
flushTestUsers();
|
||||
|
||||
List<User> users = repository.queryByAgeInOrFirstname(new Integer[0], secondUser.getFirstname());
|
||||
assertThat(users, hasSize(1));
|
||||
assertThat(users.get(0), is(secondUser));
|
||||
}
|
||||
|
||||
private Page<User> executeSpecWithSort(Sort sort) {
|
||||
|
||||
flushTestUsers();
|
||||
|
||||
@@ -7,11 +7,13 @@ import java.lang.reflect.Method;
|
||||
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.PersistenceContext;
|
||||
import javax.persistence.criteria.CriteriaBuilder;
|
||||
import javax.persistence.criteria.ParameterExpression;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.springframework.data.jpa.domain.sample.User;
|
||||
import org.springframework.data.jpa.provider.PersistenceProvider;
|
||||
import org.springframework.data.repository.query.DefaultParameters;
|
||||
import org.springframework.data.repository.query.Parameters;
|
||||
import org.springframework.data.repository.query.ParametersParameterAccessor;
|
||||
@@ -42,7 +44,9 @@ public class ParameterExpressionProviderTests {
|
||||
ParametersParameterAccessor accessor = new ParametersParameterAccessor(parameters, new Object[] { 1 });
|
||||
Part part = new Part("IdGreaterThan", User.class);
|
||||
|
||||
ParameterMetadataProvider provider = new ParameterMetadataProvider(em.getCriteriaBuilder(), accessor);
|
||||
CriteriaBuilder builder = em.getCriteriaBuilder();
|
||||
PersistenceProvider persistenceProvider = PersistenceProvider.fromEntityManager(em);
|
||||
ParameterMetadataProvider provider = new ParameterMetadataProvider(builder, accessor, persistenceProvider);
|
||||
ParameterExpression<? extends Comparable> expression = provider.next(part, Comparable.class).getExpression();
|
||||
assertThat(expression.getParameterType(), is(typeCompatibleWith(int.class)));
|
||||
}
|
||||
|
||||
@@ -534,4 +534,19 @@ public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecifi
|
||||
@Query("select u from #{#entityName} u where u.firstname = ?#{[0]} and u.lastname = ?#{[1]}")
|
||||
List<User> findUsersByFirstnameForSpELExpressionWithParameterIndexOnlyWithEntityExpression(String firstname,
|
||||
String lastname);
|
||||
|
||||
/**
|
||||
* DATAJPA-606
|
||||
*/
|
||||
List<User> findByAgeIn(Collection<Integer> ages);
|
||||
|
||||
/**
|
||||
* DATAJPA-606
|
||||
*/
|
||||
List<User> queryByAgeIn(Integer[] ages);
|
||||
|
||||
/**
|
||||
* DATAJPA-606
|
||||
*/
|
||||
List<User> queryByAgeInOrFirstname(Integer[] ages, String firstname);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user