3

当我写

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?

严重:servlet [appServlet] 在路径 [/ui] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 java.lang.NullPointerException],根本原因 java.lang.NullPointerException 在 org.hibernate.dialect.function.SQLFunctionRegistry.findSQLFunction(SQLFunctionRegistry.java:41)

在此处输入图像描述

4

1 回答 1

10

从第一个查询中删除(实体中select Candidate是否有字段)?完整实体选择的 HQL 语法是.CandidateCandidatefrom <mapped entity>...


关于你的问题:

NPE 是如何发生的:(...经过一些调试或 HQL 解析器)
HQL 解析器 - 在 AST 构建期间 - 查找调用的属性引用Candidate但没有找到它,因此尝试解析为 ClassName 或函数(看在org.hibernate.hql.internal.ast.util.LiteralProcessor.processConstant()函数中);候选者是一个类名,解析器威胁它作为一个鉴别器值(用于实体子类化)返回空值。
在该解析器之后,在翻译选择的显式列表期间查找Candidatenull并尝试将其解析为函数,因为null它不是有效的数据类型(实体、原语或其他有效的数据类型),因此尝试将它们解析为函数;null我们用作SQLFunctionRegistry.findSQLFunction()此主体的函数的参数的值:

public SQLFunction findSQLFunction(String functionName) {
        return sfi.getSqlFunctionRegistry().findSQLFunction( functionName.toLowerCase() );
    }

functionName.toLowerCase()导致 NPE。

于 2013-08-09T15:31:22.910 回答