HHH-12067: NativeQueryTupleTransformer doesn't handle null values in returned ResultSet
This commit is contained in:
parent
c3f61c73dd
commit
4b8cfe0c1f
|
@ -81,12 +81,11 @@ public class NativeQueryTupleTransformer extends BasicTransformerAdapter {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Object get(String alias) {
|
public Object get(String alias) {
|
||||||
Object tupleElement = aliasToValue.get( alias.toLowerCase() );
|
final String lowerCasedAlias = alias.toLowerCase();
|
||||||
|
if (!aliasToValue.containsKey(lowerCasedAlias)) {
|
||||||
if ( tupleElement == null ) {
|
|
||||||
throw new IllegalArgumentException( "Unknown alias [" + alias + "]" );
|
throw new IllegalArgumentException( "Unknown alias [" + alias + "]" );
|
||||||
}
|
}
|
||||||
return tupleElement;
|
return aliasToValue.get(lowerCasedAlias);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
package org.hibernate.jpa.spi;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
|
||||||
|
import javax.persistence.Tuple;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Maksym Symonov
|
||||||
|
*/
|
||||||
|
public class NativeQueryTupleTransformerTest {
|
||||||
|
|
||||||
|
private final NativeQueryTupleTransformer nativeQueryTupleTransformer = new NativeQueryTupleTransformer();
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void nullValueIsExtractedFromTuple() {
|
||||||
|
final Tuple tuple = (Tuple) nativeQueryTupleTransformer.transformTuple(
|
||||||
|
new Object[] { 1L, null },
|
||||||
|
new String[] { "id", "value" }
|
||||||
|
);
|
||||||
|
assertEquals(1L, tuple.get("id"));
|
||||||
|
assertNull(tuple.get("value"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expected = IllegalArgumentException.class)
|
||||||
|
public void missingAliasCausesExceptionWhenIsExtractedFromTuple() {
|
||||||
|
final Tuple tuple = (Tuple) nativeQueryTupleTransformer.transformTuple(
|
||||||
|
new Object[] { 1L, null },
|
||||||
|
new String[] { "id", "value" }
|
||||||
|
);
|
||||||
|
tuple.get("unknownAlias");
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,6 +18,7 @@ import java.util.stream.Collectors;
|
||||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||||
import static org.junit.Assert.assertArrayEquals;
|
import static org.junit.Assert.assertArrayEquals;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertNull;
|
||||||
|
|
||||||
@RequiresDialect(H2Dialect.class)
|
@RequiresDialect(H2Dialect.class)
|
||||||
public class TupleNativeQueryTest extends BaseEntityManagerFunctionalTestCase {
|
public class TupleNativeQueryTest extends BaseEntityManagerFunctionalTestCase {
|
||||||
|
@ -700,12 +701,17 @@ public class TupleNativeQueryTest extends BaseEntityManagerFunctionalTestCase {
|
||||||
});
|
});
|
||||||
doInJPA(this::entityManagerFactory, entityManager -> {
|
doInJPA(this::entityManagerFactory, entityManager -> {
|
||||||
List<Tuple> tuples = getTupleResult(entityManager);
|
List<Tuple> tuples = getTupleResult(entityManager);
|
||||||
List<TupleElement<?>> result = tuples.get(0).getElements();
|
final Tuple tuple = tuples.get(0);
|
||||||
|
List<TupleElement<?>> result = tuple.getElements();
|
||||||
assertEquals(2, result.size());
|
assertEquals(2, result.size());
|
||||||
assertEquals(BigInteger.class, result.get(0).getJavaType());
|
final TupleElement<?> firstTupleElement = result.get(0);
|
||||||
assertEquals("id", result.get(0).getAlias());
|
assertEquals(BigInteger.class, firstTupleElement.getJavaType());
|
||||||
assertEquals(Object.class, result.get(1).getJavaType());
|
assertEquals("id", firstTupleElement.getAlias());
|
||||||
assertEquals("firstname", result.get(1).getAlias());
|
assertEquals(BigInteger.valueOf(1L), tuple.get(firstTupleElement.getAlias()));
|
||||||
|
final TupleElement<?> secondTupleElement = result.get(1);
|
||||||
|
assertEquals(Object.class, secondTupleElement.getJavaType());
|
||||||
|
assertEquals("firstname", secondTupleElement.getAlias());
|
||||||
|
assertNull(tuple.get(secondTupleElement.getAlias()));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue