Skip to content

Commit 343f5c7

Browse files
committed
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.
1 parent bf6a517 commit 343f5c7

File tree

2 files changed

+28
-6
lines changed

2 files changed

+28
-6
lines changed

src/main/java/org/springframework/data/jpa/repository/query/AbstractJpaQuery.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ public Object convert(Object source) {
269269

270270
Object value = tuple.get(elements.get(0));
271271

272-
if (type.isInstance(value)) {
272+
if (type.isInstance(value) || value == null) {
273273
return value;
274274
}
275275
}

src/test/java/org/springframework/data/jpa/repository/query/TupleConverterUnitTests.java

+27-5
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import javax.persistence.Tuple;
2525
import javax.persistence.TupleElement;
2626

27+
import org.junit.Before;
2728
import org.junit.Test;
2829
import org.junit.runner.RunWith;
2930
import org.mockito.Mock;
@@ -49,18 +50,24 @@ public class TupleConverterUnitTests {
4950
@Mock TupleElement<String> element;
5051
@Mock ProjectionFactory factory;
5152

53+
ReturnedType type;
54+
55+
@Before
56+
public void setUp() throws Exception {
57+
58+
RepositoryMetadata metadata = new DefaultRepositoryMetadata(SampleRepository.class);
59+
QueryMethod method = new QueryMethod(SampleRepository.class.getMethod("someMethod"), metadata, factory);
60+
61+
this.type = method.getResultProcessor().getReturnedType();
62+
}
63+
5264
/**
5365
* @see DATAJPA-984
5466
*/
5567
@Test
5668
@SuppressWarnings("unchecked")
5769
public void returnsSingleTupleElementIfItMatchesExpectedType() throws Exception {
5870

59-
RepositoryMetadata metadata = new DefaultRepositoryMetadata(SampleRepository.class);
60-
QueryMethod method = new QueryMethod(SampleRepository.class.getMethod("someMethod"), metadata, factory);
61-
ReturnedType type = method.getResultProcessor().getReturnedType();
62-
63-
doReturn(element).when(tuple).get(0);
6471
doReturn(Arrays.asList(element)).when(tuple).getElements();
6572
doReturn("Foo").when(tuple).get(element);
6673

@@ -69,6 +76,21 @@ public void returnsSingleTupleElementIfItMatchesExpectedType() throws Exception
6976
assertThat(converter.convert(tuple), is((Object) "Foo"));
7077
}
7178

79+
/**
80+
* @see DATAJPA-1024
81+
*/
82+
@Test
83+
@SuppressWarnings("unchecked")
84+
public void returnsNullForSingleElementTupleWithNullValue() throws Exception {
85+
86+
doReturn(Arrays.asList(element)).when(tuple).getElements();
87+
doReturn(null).when(tuple).get(element);
88+
89+
TupleConverter converter = new TupleConverter(type);
90+
91+
assertThat(converter.convert(tuple), is(nullValue()));
92+
}
93+
7294
static interface SampleRepository extends CrudRepository<Object, Long> {
7395
String someMethod();
7496
}

0 commit comments

Comments
 (0)