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

时间:2017-04-14 08:03:23

标签: java spring hibernate jpa

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

HibernateTemplate提供以下界面:public int bulkUpdate(String,Object...)

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

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

  • 以上查询会产生弃用警告[DEPRECATION] Encountered positional parameter near line 1, column 172 in HQ
  • 使用JPA样式参数(UPDATE entity item 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的查询参数,但最终作者让程序使用非位置参数而不提及(或者根本没有)任何警告。

1 个答案:

答案 0 :(得分:2)

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

因此,如果您有实体,则可以添加扩展SpringDataJpa中支持的任何reposiotry接口的接口,并添加修改查询。

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是我用

测试的项目