Query query = sessionFactory.getCurrentSession().createQuery(hql);
// NPE 發生在 sessionFactory.getCurrentSession() 或 createQuery()
public List getResult(String hql, Object[] parameters) {
// 1. 判空 sessionFactory
if (sessionFactory == null) {
throw new IllegalStateException("sessionFactory 未注入,請檢查 Spring 配置");
}
// 2. 獲取 Session 並判空
Session session = sessionFactory.getCurrentSession();
if (session == null) {
throw new IllegalStateException("getCurrentSession() 返回 null,通常因無活動事務。請在服務層方法加 @Transactional");
}
// 3. 創建 Query 並判空
Query query = session.createQuery(hql);
if (query == null) {
throw new IllegalStateException("createQuery 返回 null,HQL 語法可能有誤: " + hql);
}
// 4. 設置參數
if (parameters != null && parameters.length > 0) {
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i, parameters[i]);
}
}
return query.list();
}
// 在調用處臨時加入
System.out.println("sessionFactory = " + sessionFactory);
System.out.println("currentSession = " + sessionFactory.getCurrentSession());
多數「莫名其妙」的 NPE 實為**依賴注入未生效**或**事務邊界缺失**,加上判空日誌即可定位。