From e13898e0012a2221c8ebc335351d63ba34823522 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 13 Dec 2016 10:46:44 +0100 Subject: [PATCH] DATAJPA-1024 - TupleConverter now guards against single-element tuples with null value. We now also return a single-element tuple value as is if it's null as for some reason some persistence providers (*cough* Hibernate *cough*) will return a single-element, null value containing tuple (instead of null in the first place) for queries that didn't yield a result. --- .../repository/query/AbstractJpaQuery.java | 2 +- .../query/TupleConverterUnitTests.java | 32 ++++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java b/src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java index 780725e33..954e9fa53 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java @@ -269,7 +269,7 @@ public abstract class AbstractJpaQuery implements RepositoryQuery { Object value = tuple.get(elements.get(0)); - if (type.isInstance(value)) { + if (type.isInstance(value) || value == null) { return value; } } diff --git a/src/test/java/org/springframework/data/jpa/repository/query/TupleConverterUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/TupleConverterUnitTests.java index 6e1ee977b..c4d375f4c 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/TupleConverterUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/TupleConverterUnitTests.java @@ -24,6 +24,7 @@ import java.util.Arrays; import javax.persistence.Tuple; import javax.persistence.TupleElement; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; @@ -49,6 +50,17 @@ public class TupleConverterUnitTests { @Mock TupleElement element; @Mock ProjectionFactory factory; + ReturnedType type; + + @Before + public void setUp() throws Exception { + + RepositoryMetadata metadata = new DefaultRepositoryMetadata(SampleRepository.class); + QueryMethod method = new QueryMethod(SampleRepository.class.getMethod("someMethod"), metadata, factory); + + this.type = method.getResultProcessor().getReturnedType(); + } + /** * @see DATAJPA-984 */ @@ -56,11 +68,6 @@ public class TupleConverterUnitTests { @SuppressWarnings("unchecked") public void returnsSingleTupleElementIfItMatchesExpectedType() throws Exception { - RepositoryMetadata metadata = new DefaultRepositoryMetadata(SampleRepository.class); - QueryMethod method = new QueryMethod(SampleRepository.class.getMethod("someMethod"), metadata, factory); - ReturnedType type = method.getResultProcessor().getReturnedType(); - - doReturn(element).when(tuple).get(0); doReturn(Arrays.asList(element)).when(tuple).getElements(); doReturn("Foo").when(tuple).get(element); @@ -69,6 +76,21 @@ public class TupleConverterUnitTests { assertThat(converter.convert(tuple), is((Object) "Foo")); } + /** + * @see DATAJPA-1024 + */ + @Test + @SuppressWarnings("unchecked") + public void returnsNullForSingleElementTupleWithNullValue() throws Exception { + + doReturn(Arrays.asList(element)).when(tuple).getElements(); + doReturn(null).when(tuple).get(element); + + TupleConverter converter = new TupleConverter(type); + + assertThat(converter.convert(tuple), is(nullValue())); + } + static interface SampleRepository extends CrudRepository { String someMethod(); }