You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JPA中不使用@Query与save()方法的更新操作实现方式有哪些?

可行实现方案

方案1:使用Spring Data JPA 派生更新方法(Spring Data JPA 2.2及以上版本支持)

Spring Data JPA支持按照命名规则自动生成更新语句,不需要手动编写@Query注解内的SQL逻辑,只需要在Repository接口中按照规则定义方法即可:

@Repository
@Transactional
public interface CreditDataFileRepository extends JpaRepository<CreditDataFileEntity, String> {
    // 按照命名规则定义派生更新方法,不需要手动编写@Query内的SQL
    @Modifying
    int updateByFilename(Integer totalRec, Integer processedRec, Integer rejectedRec, String filename);
}
  • 方法名以updateBy开头,后面跟查询条件的字段名(这里是Filename对应实体的filename字段),方法入参顺序先放要更新的字段值,最后放条件参数即可
  • 返回值int为本次更新影响的行数,可根据业务需要保留或改为void

方案2:使用EntityManager原生API构建更新逻辑

可以直接注入JPA的EntityManager,通过Criteria API动态构建更新语句,完全不需要依赖Repository层的@Query或者save()方法:

@Service
public class CreditDataFileService {
    @PersistenceContext
    private EntityManager entityManager;

    @Transactional
    public int updateFileRecord(Integer totalRec, Integer processedRec, Integer rejectedRec, String filename) {
        CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        // 构建更新操作对象
        CriteriaUpdate<CreditDataFileEntity> update = cb.createCriteriaUpdate(CreditDataFileEntity.class);
        Root<CreditDataFileEntity> root = update.from(CreditDataFileEntity.class);
        
        // 设置要更新的字段
        update.set("totalRec", totalRec);
        update.set("processedRec", processedRec);
        update.set("rejectedRec", rejectedRec);
        // 设置更新条件
        update.where(cb.equal(root.get("filename"), filename));
        
        // 执行更新返回影响行数
        return entityManager.createQuery(update).executeUpdate();
    }
}
  • 该方式支持动态拼接更新条件,适合复杂场景下的更新逻辑
  • 不需要修改原有Repository接口的定义

方案3:使用JdbcTemplate直接执行更新

如果完全不想依赖JPA的更新机制,可以直接注入Spring的JdbcTemplate执行原生更新SQL:

@Service
public class CreditDataFileService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional
    public int updateFileRecord(Integer totalRec, Integer processedRec, Integer rejectedRec, String filename) {
        String sql = "update passdb.creditdata_files set total_rec=?, processed_rec=?, rejected_rec=? where filename=?";
        return jdbcTemplate.update(sql, totalRec, processedRec, rejectedRec, filename);
    }
}
  • 该方式性能最高,适合对SQL执行效率有要求的场景
  • 需要自行维护SQL语句的正确性

内容的提问来源于stack exchange,提问作者shady_bat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:45:01