gpt4 book ai didi

java - hibernate 中的魔法 npe

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:56:52 24 4
gpt4 key购买 nike

当我写作时

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?

SEVERE: Servlet.service() for servlet [appServlet] in context with path [/ui] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException at org.hibernate.dialect.function.SQLFunctionRegistry.findSQLFunction(SQLFunctionRegistry.java:41)

enter image description here

最佳答案

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


关于您的问题:

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

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

functionName.toLowerCase()导致NPE。

关于java - hibernate 中的魔法 npe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18149558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com