如何在 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 子句前还有一个逗号,这是另一个语法错误。