【问题标题】:NamedParameterJdbcTemplate query method returning wrong integer valueNamedParameterJdbcTemplate 查询方法返回错误的整数值
【发布时间】:2017-11-24 10:55:05
【问题描述】:

我正在 java 中使用 NamedParameterJdbcTemplate 运行一个简单的 mysql 查询。

问题是我的 java 查询返回 count 字段的二进制值,即 1 表示所有非零值0 表示所有零值。当我直接在 mysql 服务器上运行 jdbc 发送到 mysql 的相同查询时,我得到了正确的答案。

详情如下:

这里是查询:

SELECT CAST(COUNT(DISTINCT :fieldName) AS UNSIGNED) count, user_id userId FROM "+ tableName + " WHERE user_id IN (:userIdList) GROUP BY userId

执行查询的 java LOC:

NamedParameterJdbcTemplate namedJdbcTemplate = new   NamedParameterJdbcTemplate(getJdbcTemplate().getDataSource());

    List<CountRow> countRows = namedJdbcTemplate.query(query,parameters,new CountRowMapper());

countRow 类是:

public class CountRow {
private int count;
private String userId;

public CountRow() {
    super();
    // TODO Auto-generated constructor stub
}

public void setUserId(String userId) {
    this.userId = userId;
}
public void setCount(int count) {
    this.count = count;
}

public int getCount() {
    return count;
}

public String getUserId() {
    return userId;
}

}

我正在查询的列的详细信息:

  `user_id` varchar(30) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL DEFAULT '',
  `fieldName` varchar(15) DEFAULT NULL,
ENGINE=MyISAM DEFAULT CHARSET=latin1

最后,我的jdbc连接url是:

jdbc:mysql://127.0.0.1/mydb?zeroDateTimeBehavior=convertToNull&amp;useSSL=false&amp;autoReconnect=true&amp;useUnicode=yes&amp;characterEncoding=UTF8&amp;characterSetResults=UTF8

我完全不知道为什么会这样。如果有人能对此有所了解,那就太好了。

谢谢

【问题讨论】:

  • 当你使用参数时,你最终得到的不是对表的引用——它是一个静态字符串或数字值,像这样:select count(distinct 'id') from my_table。如果没有行匹配谓词,则基本上返回 0,如果至少有一行匹配则返回 1(所有行返回相同的值,“id”)。
  • 我不敢相信我又错过了这个。感谢您指出我的疏忽。

标签: java mysql jdbc jdbctemplate sqlparameter


【解决方案1】:

我认为您不能以这种方式使用参数:fieldName。 尝试像 tablename 那样使用连接构建 sql 查询

"SELECT COUNT(DISTINCT " + fieldName + ") count, user_id userId 
FROM "+ tableName + " WHERE user_id IN (:userIdList) GROUP BY userId

希望对你有帮助

【讨论】:

  • 正如我在上面评论的那样,这个错误就像他们来的一样愚蠢,似乎我总是上当。无论如何,感谢您的回答,希望我不会再为此而堕落。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 2017-03-01
  • 2023-03-20
  • 1970-01-01
  • 2018-03-15
  • 2023-01-22
相关资源
最近更新 更多