2016-12-28 111 views
0

我想用prepareStatement來更新表格。但輸入可能爲空值。通過使用IsNull,它只能應用於varchar,int,double怎麼樣?SQL如何使用prepareStatement更新爲int和double指定帶IsNull的字段?

我會收到一個JSON對象(隻字段必須更新),例如:

{        { 
price: 1.56  OR   name: "aa",   OR  ... 
}        age:10    
           } 

對於int和double,如果該值沒有設置,當我得到的值,它將返回0,當用戶沒有傳遞給我時,如何將它設置爲null?

我的類:

private String name; 
private int age; 
private double price; 
//public get & set method 

我的Java:

strQuery = "UPDATE table SET name=IsNull(?, name), age=IsNull(?, age), price=IsNull(?, age) WHERE id= ?"; 
stmt = (PreparedStatement) conn.prepareStatement(strQuery); 
stmt.setString(1, obj.getName()); //string 
stmt.setString(2, obj.getAge()); //int 
stmt.setString(3, obj.getPrice()); //double 
stmt.setString(4, id); 

我的問題:

如何捕捉到JSON輸入,如果字段(INT /雙)不可用,則將它設置爲null?

我試着用Double而不是double,這是工作,但我不確定這是否是好方法。 (我是一個完整的新手)

或任何其他最好的方式來做我想做的事情?

+0

如果你想知道nullness,你應該用'Integer'和'Double'來代替。順便說一句:這似乎並不是一個SQL或JDBC問題,它更像是你映射你的JSON的方法之一。 –

+0

你可以分享這個類的代碼嗎?obj'表示的實例?看起來像你應該使用_null對象pattern_來表示和識別未初始化的字段。 –

回答

0

在設置參數

stmt.setInt(2, obj.getAge() != 0 ? obj.getAge() : null); 
stmt.setDouble(3, obj.getPrice() != 0 ? obj.getPrice() : null); 

現在你可以比較的對象,正如你所說採用雙層它的作品,因爲類對象是在初始化過程中指定爲空默認。但是,原始類型會被分配默認值。例如int-0,double-0.0,bool-false等。您可以查看更多信息。任何一種方法在設置參數時都使用包裝類或比較工作。但更好的是比較。

+0

你怎麼知道值'0'應該表示'null'而不是實際的'0'?這似乎是問題的核心。 –

+0

那麼,在這種情況下,切換到使用Double和Integer,如果未指定,則設置爲null。我們不能將0視爲null,但您可以選擇一些臨時值(Double.MAX_VALUE和Integer.MAX_VALUE)作爲默認值,以防您真的想要使用基元。但最好的是使用對象(Double/Integer)。 – devil00

+0

這就是我評論的觀點:你的回答沒有(現在仍然沒有)真正解決這個問題。 –