NullPointerException happens in Hibernate when setting null value as parameter to Query.setParameter() with TemporalType parameter
Environment
- Red Hat JBoss Enterprise Application Platform (EAP) 8.0.x
- JPA Query with Hibernate 6.2.x
Issue
NullPointerException happens when setting null value as parameter to Query.setParameter() after migrating their Java EE application running on JBoss EAP 7.4.x (Hibernate 5.3.x) to Jakarta EE application running on JBoss EAP 8.0.x (Hibernate 6.2.x). Note that this NPE issue does not happen with JBoss EAP 7.4.x (Hibernate 5.3.x).
java.lang.NullPointerException
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.internal.BindingTypeHelper.resolveTemporalPrecision(BindingTypeHelper.java:44)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.internal.QueryParameterBindingImpl.setExplicitTemporalPrecision(QueryParameterBindingImpl.java:295)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.internal.QueryParameterBindingImpl.setBindValue(QueryParameterBindingImpl.java:240)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.spi.AbstractCommonQueryContract.setParameter(AbstractCommonQueryContract.java:1092)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.spi.AbstractSelectionQuery.setParameter(AbstractSelectionQuery.java:882)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.spi.AbstractQuery.setParameter(AbstractQuery.java:607)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.sql.internal.NativeQueryImpl.setParameter(NativeQueryImpl.java:1311)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.sql.internal.NativeQueryImpl.setParameter(NativeQueryImpl.java:111)
at org.jboss.as.jpa@8.0.6.SP1-redhat-00001//org.jboss.as.jpa.container.QueryNonTxInvocationDetacher.setParameter(QueryNonTxInvocationDetacher.java:166)
...(snip)...
or (when running on JDK 17):
java.lang.NullPointerException: Cannot invoke "org.hibernate.query.BindableType.resolveExpressible(org.hibernate.engine.spi.SessionFactoryImplementor)" because "declaredParameterType" is null
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.internal.BindingTypeHelper.resolveTemporalPrecision(BindingTypeHelper.java:44)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.internal.QueryParameterBindingImpl.setExplicitTemporalPrecision(QueryParameterBindingImpl.java:295)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.internal.QueryParameterBindingImpl.setBindValue(QueryParameterBindingImpl.java:240)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.spi.AbstractCommonQueryContract.setParameter(AbstractCommonQueryContract.java:1092)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.spi.AbstractSelectionQuery.setParameter(AbstractSelectionQuery.java:882)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.spi.AbstractQuery.setParameter(AbstractQuery.java:607)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.sql.internal.NativeQueryImpl.setParameter(NativeQueryImpl.java:1311)
at org.hibernate@6.2.31.Final-redhat-00002//org.hibernate.query.sql.internal.NativeQueryImpl.setParameter(NativeQueryImpl.java:111)
at org.jboss.as.jpa@8.0.6.SP1-redhat-00001//org.jboss.as.jpa.container.QueryNonTxInvocationDetacher.setParameter(QueryNonTxInvocationDetacher.java:166)
...(snip)...
Resolution
This issue has been reported as This content is not included.JBEAP-28737 (and Content from hibernate.atlassian.net is not included.HHH-17151 in upstream hibernate project).
The NullPointerException happens when setting null value as parameter to Query.setParameter() with TemporalType parameter (= the following methods of This content is not included.jakarta.persistence.Query API):
- setParameter(int position, Calendar value, TemporalType temporalType)
- setParameter(int position, Date value, TemporalType temporalType)
- setParameter(Parameter
param, Calendar value, TemporalType temporalType) - setParameter(Parameter
param, Date value, TemporalType temporalType) - setParameter(String name, Calendar value, TemporalType temporalType)
- setParameter(String name, Date value, TemporalType temporalType)
Note that NPE does NOT happen when setting null value as parameter Query.setParameter() without TemporalType parameter (= the following methods of This content is not included.jakarta.persistence.Query API):
- setParameter(int position, Object value)
- setParameter(String name, Object value)
- setParameter(Parameter
param, T value)
So, you can workaround this issue to use Query.setParameter() method without TemporalType parameter for null value parameter like the following code:
// workaround
if (value != null) {
query.setParameter(1, value, TemporalType.TIMESTAMP);
} else {
query.setParameter(1, value);
}
Diagnostic Steps
- A minimum example code that can reproduce the NullPointerException is like the following:
Query query = em.createNativeQuery("update Member set timeStamp = ? where id= ?");
Date value = null;
Long id = 1L;
query.setParameter(1, value, TemporalType.TIMESTAMP); // <-- NPE happens here
query.setParameter(2, id);
int res = query.executeUpdate();
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.