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:
Thomas Darimont
2014-11-14 16:18:24 +01:00
committed by Oliver Gierke
parent 36a6f958f2
commit 3590075a46
6 changed files with 177 additions and 27 deletions

View File

@@ -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();

View File

@@ -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)));
}

View File

@@ -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);
}