簡體   English   中英

如何僅更新 Java 中 @Transactional 方法中已更改的字段?

[英]How can I update only changed fields in my @Transactional method in Java?

美好的一天 親愛的開發人員! 我需要解決一些與我的方法相關的問題。 我需要創建一個允許我更改對象的編輯/更新方法。

條件之一是只有用戶更改的字段才應在數據庫中更改。 不應覆蓋所有字段。 示例:舊值名稱->“Jack”,新值名稱->“Bob”,應更改 . 但是,如果舊值是 name -> " Jack " 而新值是 name -> "Jack",則不應覆蓋該字段,因為值相等。

我需要我的方法來檢查和更改已更改的字段並在數據庫中插入更改。

我嘗試使用 sql 完成任務,但不幸的是我不知道如何設置這些值(如果新值與現在 DB 中的值相同,則不執行任何更新):


    @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 比較每個字段? 請告訴我至少一個值的示例,我如何正確執行我的任務?

PS 如果新值不等於舊值,我想更新我的值。 但如果舊值和新值相等,則不應發生任何事情

我將非常感謝您的幫助!

示例:舊值名稱->“Jack”,新值名稱->“Bob”,應更改 . 但是,如果舊值是 name -> " Jack " 而新值是 name -> "Jack",則不應覆蓋該字段,因為值相等。

別管它。 MySQL 足夠聰明,只有當它的值真正改變時它才會更新該列。

例子:

在此處輸入圖片說明

看 - 有 2 行,只有一行中的值發生了變化。 和 MySQL 報告

1 行受影響

行匹配:2 更改:1

即值沒有被事實改變的行沒有改變。

如果我理解正確,您只會在新值不是NULL時才更新表中的值。 但是,只有部分列可能會受到影響。 為此,請使用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子句前還有一個逗號,這是另一個語法錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM