【问题标题】:NullpointerException with hql query in Hibernate NameGeneratorHibernate NameGenerator 中带有 hql 查询的 NullpointerException
【发布时间】:2020-03-03 13:54:16
【问题描述】:

我对在选择中包含空值的 hql 查询有疑问,例如: "select firstname, lastname, null from Employer"

Nullpointer 来自:

Caused by: java.lang.NullPointerException
at org.hibernate.hql.internal.NameGenerator.generateColumnNames(NameGenerator.java:27)

所以 NameGenerator 在该行的代码:

public static String[][] generateColumnNames(Type[] types, SessionFactoryImplementor f) throws MappingException {
    String[][] columnNames = new String[types.length][];
    for ( int i = 0; i < types.length; i++ ) {
        int span = types[i].getColumnSpan( f );  // <-- line 27
        columnNames[i] = new String[span];
        for ( int j = 0; j < span; j++ ) {
            columnNames[i][j] = NameGenerator.scalarName( i, j );
        }
    }
    return columnNames;
}

我将其缩小到新的 Class NullNode(自 Hibernate 5 起添加),它只是为 getType() 返回 null:

public class NullNode extends AbstractSelectExpression {

   public Type getDataType() {
       return null;
   } 
 ....
}

所以我的问题是..这是休眠中的错误还是我在那个地方错过了休眠?

【问题讨论】:

  • 使用调试器并查看值为 null types[i]f
  • types[i] 为 null,因为来自 NullNode 的 getDataType() 总是返回 null
  • 你解决过这个问题吗?
  • 很遗憾,没有。我最终从 select 语句中删除了 null 并对结果进行了不同的处理。

标签: java orm nullpointerexception hibernate-5.x


【解决方案1】:

hql 和 jpql BNF 规范都不允许在 select 子句中的列直接使用 NULL 值(只有在更新语句 BNF 中我才能找到 NULL 作为允许的值)。

但是,如果您指定预期的数据类型,hibernate 似乎支持空列,我可以成功使用:

select cast(null as string) from Employer

在我的例子中,hibernate 5.4.32 也指向了这个方向。我没有收到 NPE,而是以下错误:

Caused by: org.hibernate.QueryException: No data type for node: org.hibernate.hql.internal.ast.tree.NullNode 
 \-[NULL] NullNode: 'null'
 [select null from com.example.demo.Employer]

【讨论】:

  • 感谢分享!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-27
相关资源
最近更新 更多