java - 使用 HibernateTemplate 和 IN 子句进行批量更新

标签 java spring hibernate jpa

我想使用 Spring 的 HibernateTemplate (Hibernate 5.1) 执行数据库批量更新。

HibernateTemplate 提供以下接口(interface):public intbulkUpdate(String,Object...)

我的查询是UPDATE实体项SET item.attribute.id = ? WHERE item.id in (?.....?).

我遇到了很多麻烦,想问使用 HibernateTemplate 的正确方法是什么

  • 上述查询会导致弃用警告[DEPRECATION] Encounteredpositional参数在HQ第1行第172列附近
  • 使用 JPA 样式参数替换上述查询 (UPDATE 实体项 SET item.attribute.id = ?1 WHERE item.id in (?2,?3.....?N)) 导致 Hibernate 在构建参数元数据时抛出 NullPointerException
  • one of the most authoritative Hibernate sources 上所示,命名参数会导致误导性异常

问题是:如何使用 Spring 的 HibernateTemplate正确 制定批量更新查询?正如 Mykong 正确报道的那样,HibernateTemplate 自动将查询参数设置为基于 0 的,但最终作者让程序使用非位置参数,而没有提及(或根本没有)任何警告。

最佳答案

我认为现在推荐的方法是使用 Spring Data JPA 。有入门教程here .

因此,如果您有一个实体,则可以添加一个接口(interface)来扩展 SpringDataJpa 支持的任何存储库接口(interface),并添加一个修改查询。

public interface CustomerRepository extends CrudRepository<Customer, Long> {
    @Transactional
    @Modifying
    @Query("update Customer c set c.firstName = ?1 where c.id = ?2")
    int updateNameById(String nameToUpdate, long id);
    @Transactional
    @Modifying
    @Query("update Customer c set c.firstName = ?1 where c.id in (?2)")
    int updateNameByIds(String nameToUpdate, List<Long> ids);
}

然后 Spring 将实现该方法,您可以将其用作:

customerRepo.updateNameByIds("newName", Arrays.asList(cust.getId())); 

这将生成以下 sql:

update customer set first_name=? where id in (?)

Here是我用来测试的项目

关于java - 使用 HibernateTemplate 和 IN 子句进行批量更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43407623/

相关文章:

java - 从文件中读取字节后,大多数是正确的,除了 1 是错误的和负的

java - 将数据写入App Engine项目中的离线数据存储,然后导出

java - Thymeleaf:sec:authentication 在任何情况下都会显示,而 sec:authorize 在任何情况下都不会出现

java - 使用 east-easy 调用 Rest 服务时出现运行时异常

java - 使用或不使用 Spring Beans 有什么区别?

java - Spring Hibernate H2 Junit 测试 - 如何在启动时加载模式

java - 即使表单字段留空,也会提交空字符串并在 Spring 中创建新实体

java - Thread类的start方法如何调用子类的run方法

java - Java 中的多维数组与 for 函数 - Schildt

java - 投影到类时,使用 @Query 的投影无法按预期工作