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();

2行目に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: サーブレット [appServlet] の Servlet.service() がパス [/ui] のコンテキストで例外をスローしました [リクエストの処理に失敗しました。ネストされた例外は java.lang.NullPointerException] であり、根本原因は org.hibernate.dialect.function.SQLFunctionRegistry.findSQLFunction(SQLFunctionRegistry.java:41) で java.lang.NullPointerException

ここに画像の説明を入力

4

1 に答える 1

10

select Candidate最初のクエリから削除しますか (エンティティにフィールドCandidateがありますか)? Candidate完全なエンティティ選択の HQL 構文はfrom <mapped entity>....


あなたの質問について:

魔法の NPE がどのように発生するか: (...少しのデバッグまたは HQL パーサーの後)
HQL パーサー - AST の構築中に - 呼び出されたプロパティ参照をCandidate探しますが、それが見つからないため、ClassName または関数として解決してみてください (見てください)機能中org.hibernate.hql.internal.ast.util.LiteralProcessor.processConstant()); 候補はクラス名であり、パーサーは null を返す識別子の値 (エンティティのサブクラス化用) としてそれを脅します。
そのパーサーの後、選択の明示的なリストの変換中にCandidate値で検索し、有効な dataType (エンティティ、プリミティブ、またはその他の有効なデータ型) ではないnullため、関数として解決しようとするため、それらを関数として解決しようとします。この本体として関数のパラメーターとして使用されるnull値:nullSQLFunctionRegistry.findSQLFunction()

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

そしてfunctionName.toLowerCase()NPEを引き起こします。

于 2013-08-09T15:31:22.910 に答える