我想使用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。问题是:如何正确地使用的来编写批量更新查询?正如Mykong正确地报告的那样,HibernateTemplate自动设置基于0的查询参数,但最终作者没有提到(或根本没有)任何警告就让程序使用非位置参数。
发布于 2017-04-14 09:57:55
我认为现在推荐的方法是使用春季数据JPA。有一个入门教程这里。
因此,如果您有一个实体,您可以添加一个接口来扩展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 (?)这里是我用来测试的项目。
https://stackoverflow.com/questions/43407623
复制相似问题