我想使用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
UPDATE entity item SET item.attribute.id = ?1 WHERE item.id in (?2,?3.....?N)
)替换上述查询会导致Hibernate在构建参数元数据时抛出NullPointerException 问题是:如何正确使用Spring的HibernateTemplate制定批量更新查询?正如Mykong正确报道的那样,HibernateTemplate会自动设置基于0的查询参数,但最终作者让程序使用非位置参数而不提及(或者根本没有)任何警告。
答案 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是我用
测试的项目