当前位置: 首页 > 知识库问答 >
问题:

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

曾瀚昂
2023-03-14

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

HibernateTemplate提供以下接口:public int bulkUpdate(String, Object...)

我的查询是更新实体项集合项。属性id=?其中项目。id in(

我遇到了很多麻烦,想问一下使用HibernateTemplate的正确方法是什么

  • 上述查询导致弃用警告HQ第1行第172列附近出现位置参数
  • 将上述查询替换为JPA样式的参数(UPDATE entity item SET item.attribute.id=?1,其中item.id在(?2,?3….?N))会导致在构建参数元数据时由Hibernate引发NullPointerException
  • 正如最权威的Hibernate源代码之一所示,命名参数会导致错误的异常

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

共有1个答案

殷烨
2023-03-14

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

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

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 (?)

这是我用来测试的项目

 类似资料:
  • 我想用Django更新一个表-类似这样的原始SQL: 我的第一个结果是这样的——但这很恶心,不是吗? 有没有更优雅的方式?

  • 如何使用hibernateTemplate执行批量更新操作。下面的代码抛出 原因:org。冬眠QueryParameterException:位置超出已声明序数参数的数量。请记住,序数参数是基于1的!职位:2 如何通过将用户列表作为参数传递来实现此批量更新操作???

  • 问题内容: 如何批量更新mysql数据?如何定义这样的事情: 具有一些值,例如: 和其他值: 也许用mysql是不可能的?一个PHP脚本? 问题答案: 在这种情况下,最简单的解决方案是使用构造。它的工作速度非常快,并且可以轻松完成工作。 或使用建筑

  • 我有一个和这个问题很相似的问题。 我正在从表1中为表2中的字段3和字段4的所有匹配唯一组合选择所有数据。 我希望我的where子句类似于: 但这是Hibernate不允许的。 我已经尝试推出where子句,使其具有两个子查询,并根据结果检查field1和field2,但似乎子查询总是必须返回多列。我使用group by完成了这个操作,但是Hibernate会自动将group by中的列添加到投影列

  • 我有一个这样的实体: 我有一个生成HQL的代码: 执行更新的代码: 问题: 乐观锁在这里出现吗?在上述情况下,Hibernate是否会自动处理乐观锁定(运行HQL且没有会话)? 如果上述情况不正确,我需要自己实现:我阅读了Hibernate文档,其中说,我需要用注释一个字段。但是我应该专门为此在表中添加这个新字段吗?或者我可以为注释指定任何现有字段?这里有什么特殊处理吗? 在乐观锁定期间抛出的异常

  • 问题内容: 我已经设法在SQLAlchemy中使用批量插入,例如: 我现在需要的是等效的更新。我已经试过了: 期望每一行都根据“ id”字段进行更新,但是它不起作用。我以为是因为我没有指定WHERE子句,但是我不知道如何使用字典中包含的数据指定WHERE子句。 有人可以帮我吗? 问题答案: 阅读文档的“插入,更新和删除”部分。以下代码将帮助您入门: