正常查询运行时,jdbcTemplate.queryForObject返回EmptyResultDataAccessException

时间:2018-09-13 10:08:23

标签: java spring-jdbc jdbctemplate

我正尝试使用jdbcTemplate.queryForObject将普通查询更改为参数化查询,以避免SQL注入。但是查询返回EmptyResultDataAccessException-结果大小不正确:预期为1,实际为0,正常查询可以正常工作。以下是我可以得到正确结果的常规查询。

StringBuilder builder = new StringBuilder();
String AcctNameBuilder = adhpDetailUtil.getAccName();
builder.append("select * " +    
                "from gfc.LSI_ELGBLTY " +
                "where INSURANCE_ID = '" + request.getInsuranceId() + "' and " +
                "SYS_CD = '" + request.getSystemId() + "' and " +
                "ACCT_TYPE in (" + AcctNameBuilder.toString() + ")");

这是我根据上述查询创建的参数化查询。

StringBuilder builder = new StringBuilder();
String AcctNameBuilder = adhpDetailUtil.getAccName();
    final String QUERY = "select * " +  "from gfc.LSI_ELGBLTY " + "where INSURANCE_ID = ? and " + "SYS_CD = ? and " + "ACCT_TYPE in (?)";
    Object[] params = new Object[]  {
    request.getInsuranceId(),request.getSystemId(),AcctNameBuilder};
    String ids = jdbcTemplate.queryForObject(QUERY, params, String.class);
    builder.append(ids)

在第一种情况下,builder.append包含确切的查询,而在第二种情况下,jdbcTemplate.queryForObject返回EmptyResultDataAccessException。我在这里做错了。

1 个答案:

答案 0 :(得分:0)

我不相信您可以像这样为“ IN”子句附加ID。

从技术上讲,“ IN”子句的参数是一个数组。几年前,我遇到了这个问题,但我认为这还没有真正解决过。

如果考虑到这一点,这是一个相当困难的问题,因为用于准备语句的查询计划人员无法有效地限制参数的数量。