以下是我如何使用NamedParameterJdbcTemplate
:
SqlParameterSource params = new MapSqlParameterSource("column1", value1)
.addValue("column2", value2)
.addValue("column3", value3);
List<String> values = namedParameterJdbcTemplate.query("SELECT column4 FROM my_table WHERE column1=:column1 and column2=:column2 and column3=:column3", params, (rs, numRow) -> {
return rs.getString("column4");
});
这通常可以正常工作,但我有一个value2
可以为null的情况。然后它不起作用,因为null can't be compared normally。
如何让namedParameterJdbcTemplate
处理我正在寻找空的情况?
要明确的是,为了使SQL查询正确,需要评估为WHERE ... and column2 is null ...
而不是WHERE ... and column2=null
。
答案 0 :(得分:4)
尝试使用:
SELECT
column4
FROM
my_table
WHERE
(column1=:column1 OR (column1 IS NULL AND :column1 IS NULL)) and
(column2=:column2 OR (column2 IS NULL AND :column2 IS NULL)) and
(column3=:column3 OR (column3 IS NULL AND :column3 IS NULL))
或者,您可以尝试使用COALESCE
:
COALESCE(column1, '') = COALESCE(:column1, '')
假设您想要将空字符串与NULL
等同起来。此外,这将排除在column1
上使用任何索引,因此请注意这一点。
您还可以尝试根据以下值更改查询字符串:column1,2和3 - 将其调整为适当地使用=
或IS NULL
。