DATAJPA-1115 - Adapt to QuerydslPredicateExecutor API changes.

We now return Optional<T> for findOne(Predicate).

Original pull request: #202.
Related ticket: DATACMNS-1059.
This commit is contained in:
Christoph Strobl
2017-05-11 10:21:01 +02:00
committed by Oliver Gierke
parent be5946d55a
commit 86852846f3
3 changed files with 29 additions and 3 deletions

View File

@@ -18,10 +18,13 @@ package org.springframework.data.jpa.repository.support;
import java.io.Serializable;
import java.util.List;
import java.util.Map.Entry;
import java.util.Optional;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import com.querydsl.core.NonUniqueResultException;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
@@ -94,8 +97,13 @@ public class QuerydslJpaRepository<T, ID extends Serializable> extends SimpleJpa
* @see org.springframework.data.querydsl.QuerydslPredicateExecutor#findOne(com.mysema.query.types.Predicate)
*/
@Override
public T findOne(Predicate predicate) {
return createQuery(predicate).select(path).fetchOne();
public Optional<T> findOne(Predicate predicate) {
try {
return Optional.ofNullable(createQuery(predicate).select(path).fetchOne());
} catch (NonUniqueResultException ex) {
throw new IncorrectResultSizeDataAccessException(ex.getMessage(), 1, ex);
}
}
/*

View File

@@ -59,7 +59,7 @@ public interface RoleRepository extends CrudRepository<Role, Integer>, QuerydslP
@Override
@Lock(LockModeType.READ)
@QueryHints(@QueryHint(name = "foo", value = "bar"))
Role findOne(Predicate predicate);
Optional<Role> findOne(Predicate predicate);
// DATAJPA-509
long countByName(String name);

View File

@@ -23,10 +23,12 @@ import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.assertj.core.api.Assertions;
import org.joda.time.LocalDate;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.dao.IncorrectResultSizeDataAccessException;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
@@ -54,6 +56,7 @@ import com.querydsl.core.types.dsl.PathBuilderFactory;
* @author Oliver Gierke
* @author Thomas Darimont
* @author Mark Paluch
* @author Christoph Strobl
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({ "classpath:infrastructure.xml" })
@@ -336,4 +339,19 @@ public class QuerydslJpaRepositoryTests {
assertThat(secondPage.getContent(), hasSize(0));
assertThat(secondPage.getTotalElements(), is(3L));
}
@Test // DATAJPA-1115
public void findOneWithPredicateReturnsResultCorrectly() {
Assertions.assertThat(repository.findOne(user.eq(dave))).contains(dave);
}
@Test // DATAJPA-1115
public void findOneWithPredicateReturnsOptionalEmptyWhenNoDataFound() {
Assertions.assertThat(repository.findOne(user.firstname.eq("batman"))).isNotPresent();
}
@Test(expected = IncorrectResultSizeDataAccessException.class) // DATAJPA-1115
public void findOneWithPredicateThrowsExceptionForNonUniqueResults() {
repository.findOne(user.emailAddress.contains("com"));
}
}