gpt4 book ai didi

Java Hibernate 关于更新所有表字段性能的技巧

转载 作者:可可西里 更新时间:2023-11-01 07:24:44 25 4
gpt4 key购买 nike

我有这样的需求。

protected Integer[] updateFullTable(final Class clazz){
final ProjectionList projectionList=Projections.projectionList().add(Projections.property("id"),"id");
final Criteria criteria=session.createCriteria(clazz)
.add(Restrictions.eq("typeOfOperation",1))
.add(Restrictions.eq("performUpdate",true));
criteria.setProjection(projectionList);
final List idsList=criteria.list();
final Integer[]ids = transformObjectArrayIntoIntegerArray(idList);
//NOW WE UPDATE THE ROWS IDS.
final Query query=session.createQuery("update "+clazz.getName()+" set activeRegister=true and updateTime=:updateTime where id in (:ids)")
.setParameter("updateTime",new Date())
.setParameterList("ids",ids);
query.executeUpdate();
return transform;
}

正如你们所看到的,有时我需要更新表中的所有行,我查询所有行 ID,然后在单独的查询中将更新应用到这些 ID,但表有时有很多记录介于两者之间30 秒到 10 分钟取决于表格

我已将此代码更改为只有一个这样的更新。

final Query query=session.createQuery("update "+clazz.getName()+" set activeRegister=true and updateTime=:updateTime where typeOfOperation=1 and performUpdate=true");

通过唯一的查询,我避免了第一个查询,但我不能再返回受影响的 ID。但是后来要求改了一个

final StringBuilder logRevert;

添加了参数。

需要存储更新后的 ID,以便在需要时将直接反向更新应用到数据库中。

但是随着我的更新,我无法再获取 ID。我的问题是如何使用存储过程或数据库或 hibernate 中的一些解决方法获取或返回受影响的 ID 我的意思是仅通过一个查询或增强代码获得第一个行为..

任何提示。

我试过了

  1. 使用标准
  2. 使用 HQL。
  3. 使用命名查询
  4. 使用 SQLQuery
  5. 不使用 transformer 返回原始 Object[]

但不知何故时间仍然很高。

我想要类似的东西

query.executeUpdate();   // RETURNS THE COUNT OF THE AFFECTED ROWS

但是我需要受影响的ID......

抱歉,如果问题很简单。

更新

对于@dmitry-senkovich,我可以使用 rawSQL 来完成,但不能使用 hibernate,这里提出了一个单独的问题。

https://stackoverflow.com/questions/44641851/java-hibernate-org-hibernate-exception-sqlgrammarexception-could-not-extract-re

最佳答案

下面的解决方案呢?

SET @ids = NULL;

UPDATE SOME_TABLE
SET activeRegister = true, updateTime = :updateTime
WHERE typeOfOperation = 1 and performUpdate = true
AND (SELECT @ids := CONCAT_WS(',', id, @ids));

SELECT @ids;

关于Java Hibernate 关于更新所有表字段性能的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44604763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com