Hibernate NameGenerator 中带有 hql 查询的 NullpointerException

NullpointerException with hql query in Hibernate NameGenerator

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

空指针来自:

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 起添加),它只是 returns null for getType():

public class NullNode extends AbstractSelectExpression {

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

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

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]