HQL с новым объектом

#hibernate #spring-mvc

#спящий режим #spring-mvc

Вопрос:

Здравствуйте, у меня есть запрос HQL, как показано ниже, в моем классе DAO.

 String queryString1 = "select new com.apple.ist.cm.ruleadmin.model.SearchQuestionnaire(qc.questionCategoryID,qc.questionCategoryName, qn.questionReferenceString, qn.question,qao.answerOptionGroupID,answerOptionGroup,answerStringValue) "  " from Questionnaire qn,QuestionCategory qc,QuestionAnswerOption qao,AnswerOptionGroup aog,AnswerString ans " "where qn.questionCategoryID = qc.questionCategoryID and qn.questionID=qao.questionID and qao.answerOptionGroupID=aog.answerOptionGroupID and qao.answerStringID=ans.answerStringID";

SearchQuestionnaire quest = null;
query1 = (List<SearchQuestionnaire>) hibernateTemplate.find(queryString1);
 

и у меня есть все модели, сопоставленные с 5 таблицами:

  • AnswerOptionGroup.java
  • AnswerString.java
  • QuestionAnswerOption.java
  • QuestionCategory.java
  • QuestionCategory.java .

И SearchQuestionnaire.java является фиктивным pojo для передачи с запросом, имеющим сеттеры getters для всех выбранных столбцов из приведенного выше запроса.

 public class SearchQuestionnaire {

private long questionCategoryID;
private String questionCategoryName;
private String questionReferenceString;
private long questionCategory;
private String question;
private long answerOptionGroupID;
private String answerOptionGroup;
private String answerStringValue;

public SearchQuestionnaire(){

}
public SearchQuestionnaire(long answerOptionGroupID,String answerOptionGroup){
    this.questionCategoryID = questionCategoryID;
    this.questionCategoryName = questionCategoryName;
    this.questionReferenceString = questionReferenceString;
    this.question = question;
    this.answerOptionGroupID = answerOptionGroupID;
    this.answerOptionGroup = answerOptionGroup;
    this.answerStringValue = answerStringValue;     
}
 

…….. все геттеры и сеттеры
}

Здесь с приведенным выше я получаю ошибку ниже:

 20:05:50,561 ERROR [STDERR] java.lang.NullPointerException
20:05:50,562 ERROR [STDERR]     at org.hibernate.util.ReflectHelper.getConstructor(ReflectHelper.java:195)
20:05:50,562 ERROR [STDERR]     at org.hibernate.hql.ast.tree.ConstructorNode.resolveConstructor(ConstructorNode.java:137)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.ast.tree.ConstructorNode.prepare(ConstructorNode.java:111)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.ast.HqlSqlWalker.processConstructor(HqlSqlWalker.java:862)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:1956)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1825)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1394)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:553)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:251)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
20:05:50,563 ERROR [STDERR]     at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134)
20:05:50,563 ERROR [STDERR]     at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
20:05:50,564 ERROR [STDERR]     at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
20:05:50,564 ERROR [STDERR]     at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
20:05:50,564 ERROR [STDERR]     at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
20:05:50,564 ERROR [STDERR]     at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
20:05:50,564 ERROR [STDERR]     at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)
20:05:50,564 ERROR [STDERR]     at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:914)
20:05:50,564 ERROR [STDERR]     at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1)
20:05:50,564 ERROR [STDERR]     at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406)
20:05:50,564 ERROR [STDERR]     at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374)
20:05:50,564 ERROR [STDERR]     at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:912)
20:05:50,564 ERROR [STDERR]     at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:904)
20:05:50,565 ERROR [STDERR]     at com.apple.ist.cm.ruleadmin.dao.QuestionnaireDAOImpl.listQuestionnaire(QuestionnaireDAOImpl.java:300)
20:05:50,565 ERROR [STDERR]     at com.apple.ist.cm.ruleadmin.controllers.QuestionnaireController.listQuestionnaire(QuestionnaireController.java:121)
20:05:50,565 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
20:05:50,565 ERROR [STDERR]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
20:05:50,565 ERROR [STDERR]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
20:05:50,565 ERROR [STDERR]     at java.lang.reflect.Method.invoke(Method.java:597)
20:05:50,565 ERROR [STDERR]     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
20:05:50,565 ERROR [STDERR]     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
20:05:50,565 ERROR [STDERR]     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
20:05:50,565 ERROR [STDERR]     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
20:05:50,566 ERROR [STDERR]     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
20:05:50,566 ERROR [STDERR]     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
20:05:50,566 ERROR [STDERR]     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560)
20:05:50,566 ERROR [STDERR]     at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
20:05:50,566 ERROR [STDERR]     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
20:05:50,566 ERROR [STDERR]     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
20:05:50,566 ERROR [STDERR]     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:05:50,566 ERROR [STDERR]     at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
20:05:50,566 ERROR [STDERR]     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
20:05:50,566 ERROR [STDERR]     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
20:05:50,566 ERROR [STDERR]     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
20:05:50,566 ERROR [STDERR]     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
20:05:50,566 ERROR [STDERR]     at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
20:05:50,566 ERROR [STDERR]     at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
20:05:50,567 ERROR [STDERR]     at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
20:05:50,567 ERROR [STDERR]     at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
20:05:50,567 ERROR [STDERR]     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
20:05:50,567 ERROR [STDERR]     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
20:05:50,567 ERROR [STDERR]     at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
20:05:50,567 ERROR [STDERR]     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
20:05:50,567 ERROR [STDERR]     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
20:05:50,567 ERROR [STDERR]     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
20:05:50,567 ERROR [STDERR]     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
20:05:50,567 ERROR [STDERR]     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
20:05:50,567 ERROR [STDERR]     at java.lang.Thread.run(Thread.java:680)
 

Но если бы я попытался выполнить приведенный ниже запрос в DAO, он работает нормально

 String queryString1 = "select new com.apple.ist.cm.ruleadmin.model.SearchQuestionnaire(qc.questionCategoryID,qc.questionCategoryName,qn.questionReferenceString, question)" 
             " from Questionnaire qn,QuestionCategory qc where qn.questionCategoryID = qc.questionCategoryID";
 

Пожалуйста, помогите мне в разрешении «NullPointerException».

Комментарии:

1. Ваш вопрос не был прочитан, поэтому я отредактировал его для вас. Но у вас все еще есть 8 вопросов, которые вы задали без какого-либо принятого ответа. Следуйте правилам, или вам никто не поможет. И попробуйте потратить некоторое время на форматирование вашего кода и ваших вопросов.

Ответ №1:

Я удивлен, что второй запрос работает, потому что аргументы конструктора, который вызывает запрос, не совпадают ни с одним из конструкторов SearchQuestionnaire . Убедитесь, что запрос использует то же число и тот же тип аргументов, что и один из конструкторов класса.

Кстати, второй конструктор SearchQuestionnaire сломан. Он принимает два аргумента и инициализирует большинство атрибутов самими собой.

Кстати, дизайн ваших объектов кажется сомнительным, потому что вам не нужно делать объединения с идентификаторами самостоятельно. Вместо этого у вас должны быть ассоциации между объектами и объединяться в этих ассоциациях. Например, объект вопроса не должен иметь идентификатор категории. Он должен иметь многозначную ассоциацию с QuestionCategory.

Комментарии:

1. Я получил решение своей проблемы, изменив запрос, как показано ниже:

2. Строка queryString1 = «выберите новый com.apple.ist.cm.ruleadmin.model. Поисковый запрос (qc.questioncategoryID,qc.questionCategoryName, qn.questionReferenceString, qn.question, qao.answerOptionGroupID, aog.answerOptionGroup, ans.answerStringValue) » «из вопросника qn, QuestionCategory qc, QuestionAnswerOption qao,AnswerOptionGroup aog, AnswerString ans » «где qn.questioncategoryID = qc.questioncategoryID иqn.QuestionID=qao.QuestionID и qao.answerOptionGroupID=aog.answerOptionGroupID и qao.answerStringID=ans.answerStringID или ans.answerStringValue РАВНО НУЛЮ «;

Ответ №2:

Замените примитив long на класс-оболочку Long или убедитесь, что все элементы, возвращаемые вашим запросом, не равны null .

Причина в том, что long является примитивным и не может принимать нулевое значение. В режиме гибернации рекомендуется использовать классы-оболочки для всех полей с нулевым значением в вашей таблице.

Комментарии:

1. Я запустил тот же запрос в SQLDeveloper, и он выдает список результатов, поэтому запрос не возвращает null

2. В списке результатов были какие-либо нулевые значения?

3. Вот почему вы должны изменить тип long на Long , как я сказал в ответе.потому что long является примитивным и не может принимать нулевое значение . также не забудьте принять ответ, если он полезен 🙂

4. я попытался, изменив значение long на Long. не работает и та же ошибка. столбец, который я получаю null для нескольких записей, — это «частная строка answerStringValue».