我需要根据日期范围从数据库中获取总和值。我尝试以下列方式使用Spring jdbcTemplate。但它没有任何回报。
public void getTotal(String from, string toDate){
String totalSql="select sum(b.finalAmount) as total from example a, example b "+
"where a.created >= TO_TIMESTAMP(:fromDate, 'MM-DD-YYYY') AND a.created < TO_TIMESTAMP(:toDate, 'MM-DD-YYYY hh24:mi:ss') "+
"and a.tradein_id=b.tradein_id";
List<Integer> checkAmt = jdbcTemplate.query(sql, new RowMapper<Integer>() {
@Override
public Integer mapRow(ResultSet rs, int rowNum) throws SQLException
{
int check = rs.getInt("TOTAL");
return check;
}
}, fromDate,toDate);
int checkAmount = jdbcTemplate.queryForObject(
totalSql, new Object[]{fromDate, toDate},Integer.class);
}
当我在查询中硬编码fromDate和toDate时,它工作正常。我假设我发送的选择参数有问题。
date和todate都是格式08/09/2016格式前端的字符串值。
答案 0 :(得分:2)
SQL正在使用命名参数,但代码正在发送参数列表。使用NamedParameterJdbcTemplate并更改您在参数中传递的方式,或使用JdbcTemplate并更改SQL以使用?
占位符而不是命名参数。
如果使用NamedParameterJdbcTemplate,则必须在SQL中按名称引用参数,并且在传递参数时必须提供名称。将它们放在地图中(如the spring-jdbc documentation):
public int countOfActorsByFirstName(String firstName) {
String sql = "select count(*) from T_ACTOR where first_name = :first_name";
SqlParameterSource namedParameters = new MapSqlParameterSource("first_name", firstName);
return this.namedParameterJdbcTemplate.queryForObject(sql, namedParameters, Integer.class);
}
或者你可以提供这样的参数:
Map args = new HashMap();
args.put("fromDate", fromDate);
args.put("toDate", toDate);
jdbcTemplate.queryForObject(sql, args, Integer.class);
如果您不想要使用命名参数,请将SQL更改为
String totalSql= "select sum(b.finalAmount) as total from example a, example b "+
"where a.created >= TO_TIMESTAMP(?, 'MM-DD-YYYY') AND a.created < TO_TIMESTAMP(?, 'MM-DD-YYYY hh24:mi:ss') "+
"and a.tradein_id=b.tradein_id"
并将其余部分留下。