2016-11-24 70 views
1

我有一個查詢,以便從單個列總結數值:JDBC模板引發NullPointerException異常時沒有行發現

int numberOfDays = jdbcTemplate.queryForObject 
("select sum(number_of_days) from business_trip where name = ? and surname = ? and type = ?",new Object[]{name,surname,"UE"},Integer.class); 

它工作正常,只要有UE類別的選定用戶出差。然後它正確地計算旅行天數。但是,如果沒有UE類別的行程,而不是零,我得到NullPointerException。我可以將此行放在try/catch中,但這是一個解決方法。我想弄清楚爲什麼NPE在這種情況下被拋出。

*2016-11-24 11:13:02.613 ERROR 8316 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause java.lang.NullPointerException: null 
at com.tfb.dao.BusinessTripDAO.getKrajoweTripsDaysForEmployee(BusinessTripDAO.java:59) ~[classes/:na]* 
+0

和線路59是一個用'jdbcTemplate.queryForObject'? – pleft

+0

這是正確的 – jarosik

回答

1

改變你的SELECT語句

"select coalesce(sum(number_of_days), 0) from business_trip where name = ? and surname = ? and type = ?" 

這樣一來,如果你得到空它會轉化爲0

+1

我認爲,因爲'queryForObject'返回一個'Object'(可以爲null),那麼你的查詢語句找不到任何行來總結,所以不是'0'而是返回'null'。這對於一個Object('Integer')來說是完全合乎邏輯的,但對於一個原始類型(int)來說則不是這樣。如果您將初始代碼更改爲整數numberOfDays = jdbcTemplate.queryForObject (「select sum(number_of_days)from business_trip where name =?and surname =?and type =?」,new Object [] {name,surname,「UE」 },Integer.class);'你還能得到NPE嗎?這就像下面這樣:int i =(Integer)null;' – pleft

+1

我做了一些研究,發現執行任何'數學'(在這種情況下爲SUM)的sql查詢會在遇到NULL值時拋出NLP而不是數字。另外:用Integer替換int並沒有改變任何東西。 – jarosik

相關問題