2016-11-24 1 views
1

Ich habe eine Abfrage numerische Werte von einzelnen Spalte zu summieren:JDBC-Vorlage wirft Nullpointer wenn keine Zeilen gefunden

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); 

Es funktioniert gut, solange es eine Geschäftsreise von UE Kategorie für ausgewählte Benutzer. Dann werden die Reisetage korrekt berechnet. Wenn es jedoch keine Reisen der Kategorie UE gibt, bekomme ich anstelle von Null NullPointerException. Ich kann diese Zeile in try/catch platzieren, aber das wäre ein Workaround. Ich möchte herausfinden, warum NPE in einem solchen Fall geworfen wird.

*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

und Linie 59 transformiert werden, die mit dem 'jdbcTemplate.queryForObject'? – pleft

+0

das ist richtig – jarosik

Antwort

1

ändern select-Anweisung zu

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

diese Weise, wenn Sie null erhalten wird es auf 0

+1

Ich denke, da 'queryForObject' ein' Object' zurückgibt (das null sein kann), dann findet Ihre Abfrageanweisung keine Zeilen, um zusammenzufassen, so dass sie anstelle von '0' 'null' zurückgibt. Und das ist vollkommen logisch für ein Objekt ('Ganzzahl'), aber nicht für einen primitiven Typ (int). Wenn Sie Ihren ursprünglichen Code zu 'Integer numberOfDays = jdbcTemplate.queryForObject ("wählen Sie Summe (number_of_days) von business_trip where Name =? Und Nachname =? Und type =?", New Object [] {Name, Vorname, "UE" }, Integer.class); 'erhalten Sie immer noch die NPE? Es ist so, als würde ich folgendes versuchen: 'int i = (Integer) null;' – pleft

+1

Ich habe etwas recherchiert und festgestellt, dass eine SQL-Abfrage, die irgendeine Art 'math' ausführt (SUM in diesem Fall), NLP wirft, wenn ein NULL-Wert auftritt anstelle von einem numerischen. Außerdem: Ersetzen von Int durch Integer hat nichts geändert. – jarosik

Verwandte Themen