diff --git a/src/main/java/org/springframework/data/jpa/repository/support/QuerydslJpaRepository.java b/src/main/java/org/springframework/data/jpa/repository/support/QuerydslJpaRepository.java index 53375ab24..741e5cabc 100644 --- a/src/main/java/org/springframework/data/jpa/repository/support/QuerydslJpaRepository.java +++ b/src/main/java/org/springframework/data/jpa/repository/support/QuerydslJpaRepository.java @@ -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 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 findOne(Predicate predicate) { + + try { + return Optional.ofNullable(createQuery(predicate).select(path).fetchOne()); + } catch (NonUniqueResultException ex) { + throw new IncorrectResultSizeDataAccessException(ex.getMessage(), 1, ex); + } } /* diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/RoleRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/RoleRepository.java index 22e17078f..9066e6fa0 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/RoleRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/RoleRepository.java @@ -59,7 +59,7 @@ public interface RoleRepository extends CrudRepository, QuerydslP @Override @Lock(LockModeType.READ) @QueryHints(@QueryHint(name = "foo", value = "bar")) - Role findOne(Predicate predicate); + Optional findOne(Predicate predicate); // DATAJPA-509 long countByName(String name); diff --git a/src/test/java/org/springframework/data/jpa/repository/support/QuerydslJpaRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/support/QuerydslJpaRepositoryTests.java index 4dfb50720..aee4ff0b4 100644 --- a/src/test/java/org/springframework/data/jpa/repository/support/QuerydslJpaRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/support/QuerydslJpaRepositoryTests.java @@ -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")); + } }