寻找构建非空值更新查询的最佳实践。
在我的实现下面,传递参数firstName,middleName,lastName,address可以为null。我想构建一个仅具有非null值的更新查询。我已使用多个if条件为非null和逗号分隔符。
public void updatePerson(String id, String firstName, String middleName, String lastName, String address) {
StringBuilder query = new StringBuilder("UPDATE PERSON SET ");
MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
mapSqlParameterSource.addValue("id", id);
boolean columnSepartor = false;
if (firstName != null) {
query.append(" FIRST_NAME =:firstName");
mapSqlParameterSource.addValue("firstName", firstName);
columnSepartor = true;
}
if (middleName != null) {
query = columnSepartor ? query.append(", MIDDLE_NAME =:middleName") : query.append(" MIDDLE_NAME =:middleName");
mapSqlParameterSource.addValue("middleName", middleName);
columnSepartor = true;
}
if (lastName != null) {
query = columnSepartor ? query.append(", LAST_NAME =:lastName") : query.append(" LAST_NAME =:lastName");
mapSqlParameterSource.addValue("lastName", lastName);
columnSepartor = true;
}
if (address != null) {
query = columnSepartor ? query.append(", ADDRESS =:address") : query.append(" ADDRESS =:address");
mapSqlParameterSource.addValue("address", address);
}
query.append(" WHERE ID =:id");
namedParameterJdbcTemplate.update(query.toString(), mapSqlParameterSource);
}
请建议针对此类用例的最佳做法。 提前谢谢。
答案 0 :(得分:1)
这将是我对该要求的首选实施方案。它很小,很容易理解,它对绝大多数应用程序也能表现得很好。
coalesce 表达式返回第一个非null值。在这种情况下,它返回新值(如果有),否则返回列中的现有值。
update person
set first_name = coalesce(:firstName, first_name)
,middle_name = coalesce(:middleName, middle_name)
,last_name = coalesce(:lastName, last_name)
,address = coalesce(:address, address)
where id = :id
答案 1 :(得分:0)
您可以按如下方式构建SQL命令:
UPDATE <your table>
SET FirstName = NVL(PassedFirstName , FirstName) ,
MidName = NVL(PassedMidName , MidName ) ,
LastName = NVL(PassedLastName , LastName ) ...
WHERE...
表示对于任何传递的空值,使用原始值更新记录。