用于记录 IN 子句中未更新元素的 SQL 语句

问题描述 投票:0回答:1

我正在使用带有多个参数的 SQL IN 子句更新表。我想知道无法更新的参数。有什么方法可以从 SQL 更新语句中获取该信息吗? 我有一个 PUT 请求正文,如下所示

{
    "personState": "N",
    "personCodes ": [
        "000418",
        "000478",
        "000058",
        "000190",
        "000217",
        "000284",
        "000344"

    ]
}

我需要向客户展示哪一个无法更新。

我的 SQL 代码片段如下

public interface PersonRepo extends JpaRepository<Person, Integer> {

    @Modifying
    @Transactional
    @Query(value = "update person set person_state = ?1, date_updated = GETDATE() "
            + "where person_number = ?2 and person_code in (?3)", nativeQuery = true)
    void updatePerson(String personState, String personNumber, String personCodes []);
}
java jpa spring-data-jpa hql
1个回答
0
投票

不幸的是,无法从单个更新查询中获取此信息。通过更新,您可能只知道已更新的行数。 JDBC 驱动程序不会通知您哪些特定行受到影响。因此,您需要找到另一种方法来了解哪些行已更新,哪些行尚未更新。 有几种方法可以做到这一点。例如:

1。事后识别更新的行

如果您可以使用某些您知道是唯一的值来更新行,那么您可以选择已更新的行。例如:

update person set person_state = ?1, date_updated = GETDATE() ", identifying_column = ?2
where person_number = ?3 and person_code in (?4)

您可以在

?2
的位置输入 UUID。

然后您可能会看到哪些行已实际更新:

select person_code from person where identifying_column = ?1

了解哪些行已更新并根据请求获得

personCodes
列表,您可以判断哪些代码未受影响。

如果请求不是太多,那么

date_updated
可能就是那个独特的值。但这当然是有风险的。

PS 请确保您在同一笔交易中执行

update
select
。否则,其他进程/线程可能会在您检查之前覆盖此列。

2。使用批量更新

这当然会慢一些,但您可以批量运行多个更新,如下所示:

update person set person_state = ?1, date_updated = GETDATE()
where person_number = ?2 and person_code = ?3

每次这样的更新都会返回“0”或“1”——然后你就知道哪一行已更新,哪一行尚未更新。 但请确保批量运行这些查询。在不进行批处理的情况下运行它们会显着减慢您的代码速度。

© www.soinside.com 2019 - 2024. All rights reserved.