我正在使用带有多个参数的 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 []);
}
不幸的是,无法从单个更新查询中获取此信息。通过更新,您可能只知道已更新的行数。 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”——然后你就知道哪一行已更新,哪一行尚未更新。 但请确保批量运行这些查询。在不进行批处理的情况下运行它们会显着减慢您的代码速度。