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
相关产品推荐
相关产品推荐

