当我写作时
Session session = sessionFactory.getCurrentSession();
List<Candidate> candidates = (List<Candidate>) session.createQuery(
"select Candidate from Candidate as candidate left outer join"
+ " candidate.skills as skill where skill.id =" + 1).list();
我在第二行有 npe
如果我写
Session session = sessionFactory.getCurrentSession();
List<Candidate> candidates = (List<Candidate>) session.createSQLQuery(
"select candidate.* from candidate inner join candidate_skill"
+ " on candidate.id = candidate_skill.candidate_id"
+ " inner join skill on candidate_skill.skill_id = skill.id"
+ " where skill.id = 1").list();
我有好的结果
为什么我在第一个例子中有NPE?
严重:路径 [/ui] 上下文中 servlet [appServlet] 的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 java.lang.NullPointerException] 其根本原因
java.lang.NullPointerException
在org.hibernate.dialect.function.SQLFunctionRegistry.findSQLFunction(SQLFunctionRegistry.java:41)
Remove select Candidate
从第一个查询开始(您是否有一个字段Candidate
in Candidate
实体)?
完整实体选择的 HQL 语法是from <mapped entity>...
.
关于你的问题:
神奇的 NPE 是如何发生的:(...经过一些调试或 HQL 解析器)
HQL 解析器 - 在 AST 构建期间 - 查找名为的属性引用Candidate
并且没有找到它,所以尝试将其解析为 ClassName 或函数(查看org.hibernate.hql.internal.ast.util.LiteralProcessor.processConstant()
功能); Candidate 是一个类名,解析器威胁它作为返回 null 的鉴别器值(用于实体子类化)。
在该解析器之后,在翻译 select 的显式列表查找期间Candidate
有价值null
并尝试将其解析为函数,因为null
不是有效的数据类型(实体、基元或其他有效的数据类型),因此尝试将它们解析为函数;价值null
我们用作函数的参数SQLFunctionRegistry.findSQLFunction()
作为这个机构:
public SQLFunction findSQLFunction(String functionName) {
return sfi.getSqlFunctionRegistry().findSQLFunction( functionName.toLowerCase() );
}
and functionName.toLowerCase()
导致NPE。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)