我正在使用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
。是否有可能在我的请求中删除单引号?或者有更好的方法吗?
感谢任何帮助
答案 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值动态生成它)。