jdbcTemplate传入null值

时间:2015-06-22 18:55:13

标签: mysql spring jdbctemplate

我正在使用mysql和spring 4.1.6,但是在将null变量发送到数据库时遇到了问题。我知道发送一个空值,使用语法IS NULL,但发送到数据库的字段是可选的(整个对象中唯一的可选值),因此它可能为null或可能有值。

我对数据库的请求,简单检查CRUD方法调用的地址是否存在:

注意:有问题的变量是street2

public boolean doesExist(Address address){
    String sql = "SELECT EXISTS(SELECT * FROM Address WHERE contactType=? AND  street1=? AND street2 ? AND city=? AND state=? AND zip=? AND country=?);";

    String s = isNullDBQuery(address.getStreet2());

    jdbcTemplate = new JdbcTemplate(dataSource);
    int exist = jdbcTemplate.queryForObject(sql, new Object[] {address.getContactType().name(), address.getStreet1(), isNullDBQuery(address.getStreet2()), address.getCity(), address.getState().name(), address.getZip(), address.getCountry().name()}, Integer.class);

    if(exist == 1){
        return true;
    } else {
        return false;
    }
}

我的isNullDBQuery:

private String isNullDBQuery(String s){
    if(s == null){
        return "IS NULL";
    } else {
        return "=" + s;
    }
}

返回的错误是语法错误,其中包含“#NULL;'”。发送到数据库的查询是street2 'IS NULL',而不是street2 IS NULL。是否有可能在我的请求中删除单引号?或者有更好的方法吗?

感谢任何帮助

2 个答案:

答案 0 :(得分:2)

我设法弄清楚如何实现我想要的目标:

public boolean doesExist(Address address){
    String street2 = stringIsNull(address.getStreet2());
    String sql = "SELECT EXISTS(SELECT * FROM Address WHERE contactType=? AND  street1=? AND street2 " + street2 + " AND city=? AND state=? AND zip=? AND country=?);";
    jdbcTemplate = new JdbcTemplate(dataSource);
    int exist;

    if(street2.equals("IS NULL")){
        exist = jdbcTemplate.queryForObject(sql, new Object[] {address.getContactType().name(), address.getStreet1(), address.getCity(), address.getState().name(), address.getZip(), address.getCountry().name()}, Integer.class);
    } else {
        exist = jdbcTemplate.queryForObject(sql, new Object[] {address.getContactType().name(), address.getStreet1(), address.getStreet2(), address.getCity(), address.getState().name(), address.getZip(), address.getCountry().name()}, Integer.class);
    }

    if(exist == 1){
        return true;
    } else {
        return false;
    }

}

private String stringIsNull(String string){
    if(string == null) {
        return "IS NULL";
    } else {
        return "=?";
    }
}

答案 1 :(得分:1)

没有。只有值可以作为预准备语句的参数传递。不是查询的任意部分。

您需要使用两个不同的SQL查询(或根据street2的null值动态生成它)。