2013-08-09 2 views
3

Когда я пишумагия NPE в спящий режим

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() для сервлета [appServlet] в контексте с путём [/ ui] отказался от исключения [Обработка запроса не удалась; вложенное исключение java.lang.NullPointerException] с первопричиной java.lang.NullPointerException на org.hibernate.dialect.function.SQLFunctionRegistry.findSQLFunction (SQLFunctionRegistry.java:41)

enter image description here

+0

Что происходит, когда вы запускаете первый запрос в окне запроса? – kosa

+0

NullPointerException – user2645679

+0

, тогда я получаю объект кандидата + умение. Мне нужен единственный объект-кандидат – user2645679

ответ

9

Удалить select Candidate от первого запроса (у вас есть поле Candidate в Candidate субъекте)? Синтаксис HQL для полного выбора сущности - from <mapped entity>....


О ваш вопрос:

Как магия 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.

Смежные вопросы