我正尝试使用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
。我在这里做错了。
答案 0 :(得分:0)
我不相信您可以像这样为“ IN”子句附加ID。
从技术上讲,“ IN”子句的参数是一个数组。几年前,我遇到了这个问题,但我认为这还没有真正解决过。
如果考虑到这一点,这是一个相当困难的问题,因为用于准备语句的查询计划人员无法有效地限制参数的数量。