【发布时间】:2016-05-11 15:45:51
【问题描述】:
当使用SQLQuery q = session.createSQLQuery(query).addEntity("edu", StudentEduPojo.class); 执行 SQL 原生查询时,JVM 会抛出空指针异常。
DBConnectionDao.class
package com.ms.avalon.master.dao.rdbms;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class DBConnectionDao {
protected Session session;
protected DataSource dataSource;
protected SessionFactory sessionFactory;
protected HibernateTemplate hibernateTemplate=null;
protected NamedParameterJdbcTemplate namedJdbcTemplate=null;
@Autowired
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
namedJdbcTemplate=new NamedParameterJdbcTemplate(dataSource);
}
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
System.out.println("session created");
this.sessionFactory = sessionFactory;
session = sessionFactory.getCurrentSession();
hibernateTemplate=new HibernateTemplate(sessionFactory);
}
}
PlacementDaoRdbms.class
package com.ms.avalon.master.dao.rdbms;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.criterion.DetachedCriteria;
import com.ms.avalon.master.beans.PlacementCaseBean;
import com.ms.avalon.master.dao.PlacementDao;
import com.ms.avalon.master.formbeans.PlacementFormBean;
import com.ms.avalon.master.pojos.studentpojos.StudentEduPojo;
import com.ms.avalon.master.pojos.studentpojos.StudentTestPojo;
public class PlacementDaoRdbms extends DBConnectionDao implements PlacementDao {
@Override
public List<StudentEduPojo> searchWithCases(PlacementCaseBean caseBean, PlacementFormBean placementBean) {
String query = "Some complicated SQL query";
SQLQuery q = session.createSQLQuery(query)
.addEntity("edu", StudentEduPojo.class);
List<StudentEduPojo> list = q.list();
return list;
}
}
在 PlacementDaoRdbms 的会话中使用函数 createSqlQuery 时,我得到一个 NPE。
以下是堆栈跟踪:
2016 年 5 月 11 日晚上 8:52:17 org.apache.catalina.core.StandardWrapperValve 调用 严重:servlet [dispatcher] 在路径 [/Avalon-1.0] 的上下文中的 Servlet.service() 引发异常 [请求处理失败;嵌套异常是 java.lang.NullPointerException] 的根本原因 java.lang.NullPointerException 在 com.ms.avalon.master.dao.rdbms.PlacementDaoRdbms.searchWithCases(PlacementDaoRdbms.java:108) 在 com.ms.avalon.master.business.TalentCaseHandler.searchForCases(TalentCaseHandler.java:61) 在 com.ms.avalon.master.service.impl.PlacementServiceImpl.searchForTalent(PlacementServiceImpl.java:26) 在 com.ms.avalon.master.controllers.PlacementController.searchForTalent(PlacementController.java:29) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(未知来源) 在 java.lang.reflect.Method.invoke(未知来源) 在 org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:427) 在 org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:415) 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:788) 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:717) 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 在 org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119) 在 com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Unknown Source)
另外,这是从父类使用会话的正确方法吗?
感谢您的帮助:)
【问题讨论】:
-
分享整个代码。
-
对不起,由于版权问题,我不能。我需要帮助使用在 PlacementDaoRdbms 中的 DBConnectionDao 中创建的会话对象。 :)
-
addEntity("edu", StudentEduPojo.class) 改为addEntity(StudentEduPojo.class)
-
不,仍然得到 NPE:/
-
NPE 采用哪种方法??
标签: java sql hibernate spring-mvc session