2016-08-15 43 views
0

我有一个PostgreSQL的功能update_renovation:的Java/PostgreSQL- CallableStatement.setBoolean空,抛出NPE

CREATE OR REPLACE FUNCTION update_renovation(
    p_county character varying, 
    p_municipality character varying, 
    p_district character varying, 
    p_neighbourhood character varying, 
    p_street character varying, 
    p_number character varying, 
    p_reported_by character varying, 
    p_is_renovated boolean) //<-- NOTE THIS boolean 

RETURNS void AS 
$BODY$ 
.... 

现在我调用这个函数从Java,像这样

CallableStatement statement = con.prepareCall(" { call update_renovation(?, ?, ?, ?, ?, ?, ?, ?) } "); 

     statement.setString(1, request.getAdr().getCounty()); 
     statement.setString(2, request.getAdr().getMunicipality()); 
     statement.setString(3, request.getAdr().getDistrict()); 
     statement.setString(4, request.getAdr().getNeighbourhood()); 
     statement.setString(5, request.getAdr().getStreet()); 
     statement.setString(6, request.getAdr().getNumber()); 
     statement.setString(7, request.getClientID()); 
     statement.setBoolean(8, request.isRenovated()); //<-- NOTE THIS boolean 
     statement.execute(); 
     statement.close(); 

request.isRenovated()可能在某次为空(它返回布尔型不是布尔型)。

当发生这种情况时,java在指定的行上抛出NPE。

我阅读了关于setBoolean的文档,它接受可能是NPE原因的布尔值(不是布尔值)。

由于Postgre接受NULL值为布尔值我的问题是我如何将它设置为空的Java服务器端?

谢谢!

+0

request.isRenovated()返回什么? “布尔”还是“布尔”? – bradimus

+0

请阅读这个问题 - “request.isRenovated()可能有些时候是空的(它返回布尔值而不是布尔值)。”仍然感谢提问 – KasparTr

回答

2

如果isRenovated()回报null,你应该叫PreparedStatement.setNull()

if (request.isRenovated() == null) { 
    statement.setNull(8, Types.BOOLEAN); 
} else { 
    statement.setBoolean(8, request.isRenovated()); 
} 

请注意,您应该只有在setXXX()方法是采取一种原始的参数来做到这一点。您可以安全地将null传递给那些需要参考的人。