【问题标题】:magic npe in hibernate休眠中的魔术 npe
【发布时间】:2013-08-09 14:50:36
【问题描述】:

当我写作时

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] 的 Servlet.service() 在路径 [/ui] 的上下文中抛出异常 [请求处理失败;嵌套异常是 java.lang.NullPointerException] 的根本原因 java.lang.NullPointerException 在 org.hibernate.dialect.function.SQLFunctionRegistry.findSQLFunction(SQLFunctionRegistry.java:41)

【问题讨论】:

  • 在查询窗口中运行第一个查询时会发生什么?
  • 然后我得到候选+技能对象。我想要一个候选对象

标签: java hibernate hql


【解决方案1】:

从第一个查询中删除 select CandidateCandidate 实体中是否有字段 Candidate)? 完整实体选择的 HQL 语法为 from &lt;mapped entity&gt;...


关于您的问题:

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

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

functionName.toLowerCase() 导致 NPE。

【讨论】:

    猜你喜欢
    • 2014-10-04
    • 2020-01-11
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2010-09-18
    相关资源
    最近更新 更多