如何获取SQL IN子句中未成功更新的人员编码参数?
找出IN子句中未触发更新的personCodes值
要获取未触发更新的personCodes,核心思路是对比传入的参数列表和数据库中实际存在的符合条件的记录,具体可通过以下步骤实现:
步骤1:新增查询方法获取数据库中存在的personCodes
在你的PersonRepo中添加一个查询方法,用于找出数据库里满足person_number和person_code IN条件的所有person_code:
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); // 新增:查询符合条件的已存在person_code @Query(value = "select person_code from person where person_number = ?1 and person_code in (?2)", nativeQuery = true) List<String> findExistingPersonCodes(String personNumber, String[] personCodes); }
步骤2:在业务逻辑中对比得到未更新的代码
在处理PUT请求的业务层,先通过查询拿到数据库中存在的personCode,再和传入的列表做差集,即可得到未触发更新的参数:
// 从请求体取出传入的personCodes列表 List<String> inputPersonCodes = Arrays.asList(request.getPersonCodes()); String targetPersonNumber = "实际的personNumber值"; // 替换为业务中的personNumber参数 String targetState = request.getPersonState(); // 1. 查询数据库中符合条件的personCode List<String> existingCodes = personRepo.findExistingPersonCodes(targetPersonNumber, inputPersonCodes.toArray(new String[0])); // 2. 执行更新操作 personRepo.updatePerson(targetState, targetPersonNumber, inputPersonCodes.toArray(new String[0])); // 3. 计算未被更新的personCode(传入列表中不在存在列表内的项) List<String> unUpdatedCodes = inputPersonCodes.stream() .filter(code -> !existingCodes.contains(code)) .collect(Collectors.toList()); // unUpdatedCodes即为未触发更新的参数值
注意事项
- 确保查询和更新操作在同一个事务中执行,避免中间有其他线程修改数据导致结果偏差,可在业务方法上添加
@Transactional注解。 - 如果
person_code是唯一标识(如主键或唯一索引),对比逻辑会更精准;若存在重复值,差集逻辑依然有效。
内容的提问来源于stack exchange,提问作者user3919727
相关产品推荐
相关产品推荐

