如何在 Java 中仅更新我的 @Transactional 方法中更改的字段?
How can I update only changed fields in my @Transactional method in Java?
美好的一天亲爱的开发者!我需要解决几个与我的方法相关的问题。
我需要创建一个允许我更改对象的编辑/更新方法。
其中一个条件是只有用户更改的字段应该在数据库中更改。不应覆盖所有字段。
示例:旧值名称 -> “Jack”,新值名称 -> “Bob”,应更改。
但是,如果旧值是 name -> " Jack ",而新值是 name -> "Jack",则不应覆盖该字段,因为值是相等的。
我需要我的方法来仅检查和更改已更改的字段并将更改插入数据库。
我尝试使用 sql 完成任务,但遗憾的是我不知道如何设置值
(这个想法是,如果新值与数据库中的值相同,则不执行任何更新)
:
@Transactional(transactionManager = TransactionManagerConfig.TX_MANAGER_MAIN)
public void editUserContacts(User user) {
Connection connection = DataSourceUtils.getConnection(mainDataSource);
String sql = "UPDATE `" + userSchema + "`.l_user " +
" SET user_phone_number = @phoneNumber," +
"firstname = @fullName," +
"user_country = @userCountry," +
"house_phone_number = @phoneAlternative," +
" WHERE l_user_id=? , " +
"user_phone_number != @phoneNumber OR IS NULL," +
"firstName != @fullName OR IS NULL," +
"user_country != @userCountry OR IS NULL," +
"house_phone_number != @phoneAlternative OR IS NULL,;
try (
PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
) {
statement.executeUpdate();
statement.getUpdateCount();
} catch (SQLException e) {
throw new DAOException(e);
}
}
也许我需要先做 SELECT,或者使用 equals 比较每个字段?请至少在示例中告诉我一个值,我怎样才能正确执行我的任务?
P.S 如果新值不等于旧值,我想更新我的值。但如果旧值和新值相等,则不会发生任何事情
非常感谢您的帮助!
Example: the old value name - > "Jack", the new value name - > "Bob", should change . HOWEVER, if the old value is name - > " Jack "and the new value is name - > "Jack", then the field should not be overwritten, since the values are equals.
别在意。 MySQL 很聪明,只有当它的值真正改变时,它才会更新该列。
示例:
看 - 有 2 行,只有一行的值发生了变化。并且 MySQL 报道
1 row affected
和
Rows matched: 2 Changed: 1
即值未被事实更改的行未更改。
如果我理解正确的话,只有当新值不是 NULL
时,您才需要更新 table 中的值。但是,只有部分列可能会受到影响。为此,使用 COALESCE()
:
UPDATE " + userSchema + ".l_user
SET user_phone_number = COALESCE(@phoneNumber, user_phone_number),
firstname = COALESCE(@fullName, firstname),
user_country = COALESCE(@userCountry, user_country),
house_phone_number = COALESCE(@phoneAlternative, house_phone_number),
WHERE l_user_id = ? AND
not (user_phone_number <=> @phoneNumber and
firstName <=> @fullName and
user_country <=> @userCountry and
house_phone_number <=> @phoneAlternative
);
这将尝试仅更新四个值之一已更改的行。 <=>
是 NULL
安全比较运算符。
您的查询尝试有多个错误。
WHERE
子句不识别 ,
。那只是一个语法错误
OR IS NULL
无效 SQL。那是一个语法错误。
- 您在
WHERE
子句前还有一个逗号,这是另一个语法错误。
美好的一天亲爱的开发者!我需要解决几个与我的方法相关的问题。 我需要创建一个允许我更改对象的编辑/更新方法。
其中一个条件是只有用户更改的字段应该在数据库中更改。不应覆盖所有字段。 示例:旧值名称 -> “Jack”,新值名称 -> “Bob”,应更改。 但是,如果旧值是 name -> " Jack ",而新值是 name -> "Jack",则不应覆盖该字段,因为值是相等的。
我需要我的方法来仅检查和更改已更改的字段并将更改插入数据库。
我尝试使用 sql 完成任务,但遗憾的是我不知道如何设置值 (这个想法是,如果新值与数据库中的值相同,则不执行任何更新) :
@Transactional(transactionManager = TransactionManagerConfig.TX_MANAGER_MAIN)
public void editUserContacts(User user) {
Connection connection = DataSourceUtils.getConnection(mainDataSource);
String sql = "UPDATE `" + userSchema + "`.l_user " +
" SET user_phone_number = @phoneNumber," +
"firstname = @fullName," +
"user_country = @userCountry," +
"house_phone_number = @phoneAlternative," +
" WHERE l_user_id=? , " +
"user_phone_number != @phoneNumber OR IS NULL," +
"firstName != @fullName OR IS NULL," +
"user_country != @userCountry OR IS NULL," +
"house_phone_number != @phoneAlternative OR IS NULL,;
try (
PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)
) {
statement.executeUpdate();
statement.getUpdateCount();
} catch (SQLException e) {
throw new DAOException(e);
}
}
也许我需要先做 SELECT,或者使用 equals 比较每个字段?请至少在示例中告诉我一个值,我怎样才能正确执行我的任务?
P.S 如果新值不等于旧值,我想更新我的值。但如果旧值和新值相等,则不会发生任何事情
非常感谢您的帮助!
Example: the old value name - > "Jack", the new value name - > "Bob", should change . HOWEVER, if the old value is name - > " Jack "and the new value is name - > "Jack", then the field should not be overwritten, since the values are equals.
别在意。 MySQL 很聪明,只有当它的值真正改变时,它才会更新该列。
示例:
看 - 有 2 行,只有一行的值发生了变化。并且 MySQL 报道
1 row affected
和
Rows matched: 2 Changed: 1
即值未被事实更改的行未更改。
如果我理解正确的话,只有当新值不是 NULL
时,您才需要更新 table 中的值。但是,只有部分列可能会受到影响。为此,使用 COALESCE()
:
UPDATE " + userSchema + ".l_user
SET user_phone_number = COALESCE(@phoneNumber, user_phone_number),
firstname = COALESCE(@fullName, firstname),
user_country = COALESCE(@userCountry, user_country),
house_phone_number = COALESCE(@phoneAlternative, house_phone_number),
WHERE l_user_id = ? AND
not (user_phone_number <=> @phoneNumber and
firstName <=> @fullName and
user_country <=> @userCountry and
house_phone_number <=> @phoneAlternative
);
这将尝试仅更新四个值之一已更改的行。 <=>
是 NULL
安全比较运算符。
您的查询尝试有多个错误。
WHERE
子句不识别,
。那只是一个语法错误OR IS NULL
无效 SQL。那是一个语法错误。- 您在
WHERE
子句前还有一个逗号,这是另一个语法错误。