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]
我对 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]