【问题标题】:jdbcTemplate pass in null valuejdbcTemplate 传入空值
【发布时间】:2015-09-08 08:37:54
【问题描述】:

我正在使用 mysql 和 spring 4.1.6,但在将空变量发送到数据库时遇到问题。我知道要发送一个空值,使用语法 IS 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;
    }
}

返回的错误是带有“IS NULL”的语法错误。发送到数据库的查询是street2 'IS NULL',而不是street2 IS NULL。是否可以去掉我请求中的单引号?还是有更好的方法来做到这一点?

感谢任何帮助

【问题讨论】:

    标签: mysql spring jdbctemplate


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 "=?";
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-20
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 2019-08-30
        • 1970-01-01
        • 1970-01-01
        • 2011-03-11
        相关资源
        最近更新 更多