首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用HibernateTemplate和IN子句进行批量更新

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

Stack Overflow用户
提问于 2017-04-14 08:03:22
回答 1查看 1.5K关注 0票数 0

我想使用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。
  • 正如在最权威的Hibernate源之一上看到的,命名参数会导致错误的异常

问题是:如何正确地使用的来编写批量更新查询?正如Mykong正确地报告的那样,HibernateTemplate自动设置基于0的查询参数,但最终作者没有提到(或根本没有)任何警告就让程序使用非位置参数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-14 09:57:55

我认为现在推荐的方法是使用春季数据JPA。有一个入门教程这里。

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

代码语言:javascript
复制
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将实现该方法,您可以将其用作:

代码语言:javascript
复制
customerRepo.updateNameByIds("newName", Arrays.asList(cust.getId())); 

这将生成以下sql:

代码语言:javascript
复制
update customer set first_name=? where id in (?)

这里是我用来测试的项目。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43407623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档