我想使用 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/