Skip to content

Commit 68e4f40

Browse files
HHH-15283 - fix NPE for NamedNativeQuery + SqlResultSetMapping (columns)
1 parent 3630fba commit 68e4f40

File tree

3 files changed

+58
-4
lines changed

3 files changed

+58
-4
lines changed

Diff for: hibernate-core/src/main/java/org/hibernate/query/results/complete/CompleteResultBuilderBasicValuedStandard.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
/**
2828
* ResultBuilder for scalar results defined via:<ul>
2929
* <li>JPA {@link jakarta.persistence.ColumnResult}</li>
30-
* <li>`<return-scalar/>` as part of a `<resultset/>` stanza in `hbm.xml`</li>
30+
* <li>`&lt;return-scalar/&gt;` as part of a `&lt;resultset/&gt;` stanza in `hbm.xml`</li>
3131
* </ul>
3232
*
3333
* @author Steve Ebersole
@@ -60,7 +60,7 @@ public ResultBuilder cacheKeyInstance() {
6060

6161
@Override
6262
public Class<?> getJavaType() {
63-
return explicitJavaType.getJavaTypeClass();
63+
return explicitJavaType == null ? null : explicitJavaType.getJavaTypeClass();
6464
}
6565

6666
@Override
@@ -173,7 +173,7 @@ public boolean equals(Object o) {
173173
public int hashCode() {
174174
int result = explicitColumnName != null ? explicitColumnName.hashCode() : 0;
175175
result = 31 * result + ( explicitType != null ? explicitType.hashCode() : 0 );
176-
result = 31 * result + explicitJavaType.hashCode();
176+
result = 31 * result + ( explicitJavaType != null ? explicitJavaType.hashCode() : 0 );
177177
return result;
178178
}
179179
}

Diff for: hibernate-core/src/main/java/org/hibernate/query/sql/internal/NativeQueryImpl.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,7 @@ else if ( resultJavaType != null && resultJavaType != Object[].class ) {
278278
throw new IllegalArgumentException( "Named query exists but its result type is not compatible" );
279279
case 1:
280280
final Class<?> actualResultJavaType = resultSetMapping.getResultBuilders().get( 0 ).getJavaType();
281-
if ( !resultJavaType.isAssignableFrom( actualResultJavaType ) ) {
281+
if ( actualResultJavaType != null && !resultJavaType.isAssignableFrom( actualResultJavaType ) ) {
282282
throw buildIncompatibleException( resultJavaType, actualResultJavaType );
283283
}
284284
break;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
* Hibernate, Relational Persistence for Idiomatic Java
3+
*
4+
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
5+
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
6+
*/
7+
package org.hibernate.orm.test.query.resultmapping;
8+
9+
import org.hibernate.cfg.AvailableSettings;
10+
11+
import org.hibernate.testing.TestForIssue;
12+
import org.hibernate.testing.orm.junit.EntityManagerFactoryScope;
13+
import org.hibernate.testing.orm.junit.Jpa;
14+
import org.hibernate.testing.orm.junit.Setting;
15+
import org.junit.jupiter.api.Test;
16+
17+
import jakarta.persistence.ColumnResult;
18+
import jakarta.persistence.Entity;
19+
import jakarta.persistence.Id;
20+
import jakarta.persistence.NamedNativeQuery;
21+
import jakarta.persistence.SqlResultSetMapping;
22+
23+
/**
24+
* @author Nathan Xu
25+
*/
26+
@Jpa(
27+
annotatedClasses = NamedNativeQueryWithCountColumnTest.Sample.class,
28+
properties = @Setting(name = AvailableSettings.GLOBALLY_QUOTED_IDENTIFIERS, value = "true")
29+
)
30+
@TestForIssue(jiraKey = "HHH-15070")
31+
class NamedNativeQueryWithCountColumnTest {
32+
33+
@Test
34+
void testNoNullPointerExceptionThrown(EntityManagerFactoryScope scope) {
35+
scope.inTransaction( em ->em.createNamedQuery( "sample.count", Long.class ) );
36+
}
37+
38+
@SqlResultSetMapping(
39+
name = "mapping",
40+
columns = @ColumnResult( name = "cnt" )
41+
)
42+
@NamedNativeQuery(
43+
name = "sample.count",
44+
resultSetMapping = "mapping",
45+
query = "SELECT count(*) AS cnt FROM Sample"
46+
)
47+
@Entity(name = "Sample")
48+
static class Sample {
49+
50+
@Id
51+
Long id;
52+
53+
}
54+
}

0 commit comments

Comments
 (0)