Skip to content

Commit 1ae61b3

Browse files
committed
HHH-15278 NPE when NULL is used in the projection
1 parent 3251d5e commit 1ae61b3

File tree

3 files changed

+41
-9
lines changed

3 files changed

+41
-9
lines changed

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,12 @@
173173
import org.hibernate.sql.results.internal.SqlSelectionImpl;
174174
import org.hibernate.sql.results.jdbc.internal.JdbcValuesMappingProducerStandard;
175175
import org.hibernate.type.BasicType;
176+
import org.hibernate.type.SqlTypes;
176177
import org.hibernate.type.StandardBasicTypes;
177178
import org.hibernate.type.descriptor.WrapperOptions;
178179
import org.hibernate.type.descriptor.jdbc.JdbcLiteralFormatter;
180+
import org.hibernate.type.descriptor.sql.DdlType;
181+
import org.hibernate.type.descriptor.sql.spi.DdlTypeRegistry;
179182

180183
import static org.hibernate.query.sqm.TemporalUnit.NANOSECOND;
181184
import static org.hibernate.sql.ast.SqlTreePrinter.logSqlAst;
@@ -4293,15 +4296,22 @@ public void visitCastTarget(CastTarget castTarget) {
42934296
}
42944297
else {
42954298
final SqlExpressible expressionType = (SqlExpressible) castTarget.getExpressionType();
4299+
final DdlTypeRegistry ddlTypeRegistry = getSessionFactory().getTypeConfiguration().getDdlTypeRegistry();
4300+
DdlType ddlType = ddlTypeRegistry
4301+
.getDescriptor( expressionType.getJdbcMapping().getJdbcType().getDefaultSqlTypeCode() );
4302+
if ( ddlType == null ) {
4303+
// this may happen when selecting a null value like `SELECT null from ...`
4304+
// some dbs need the value to be cast so not knowing the real type we fall back to INTEGER
4305+
ddlType = ddlTypeRegistry.getDescriptor( SqlTypes.INTEGER );
4306+
}
4307+
42964308
appendSql(
4297-
sessionFactory.getTypeConfiguration().getDdlTypeRegistry()
4298-
.getDescriptor( expressionType.getJdbcMapping().getJdbcType().getDefaultSqlTypeCode() )
4299-
.getCastTypeName(
4300-
expressionType,
4301-
castTarget.getLength(),
4302-
castTarget.getPrecision(),
4303-
castTarget.getScale()
4304-
)
4309+
ddlType.getCastTypeName(
4310+
expressionType,
4311+
castTarget.getLength(),
4312+
castTarget.getPrecision(),
4313+
castTarget.getScale()
4314+
)
43054315
);
43064316
}
43074317
}

hibernate-core/src/main/java/org/hibernate/type/NullType.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,9 @@ public NullType(JdbcType jdbcType, JavaType<Object> javaType) {
3232
public String getName() {
3333
return "null";
3434
}
35+
36+
@Override
37+
protected boolean registerUnderJavaType() {
38+
return false;
39+
}
3540
}

hibernate-core/src/main/java/org/hibernate/type/descriptor/jdbc/NullJdbcType.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
import java.sql.CallableStatement;
1010
import java.sql.PreparedStatement;
11+
import java.sql.ResultSet;
1112
import java.sql.SQLException;
1213
import java.sql.Types;
1314

@@ -34,7 +35,23 @@ public int getJdbcTypeCode() {
3435

3536
@Override
3637
public <X> ValueExtractor<X> getExtractor(JavaType<X> javaType) {
37-
return null;
38+
return new BasicExtractor<X>(javaType, this ) {
39+
@Override
40+
protected X doExtract(ResultSet rs, int paramIndex, WrapperOptions options) throws SQLException {
41+
return null;
42+
}
43+
44+
@Override
45+
protected X doExtract(CallableStatement statement, int index, WrapperOptions options) throws SQLException {
46+
return null;
47+
}
48+
49+
@Override
50+
protected X doExtract(CallableStatement statement, String name, WrapperOptions options)
51+
throws SQLException {
52+
return null;
53+
}
54+
};
3855
}
3956

4057
@Override

0 commit comments

Comments
 (0)