我有这样的需求。Java Hibernate有关更新所有表字段的提示性能
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");
而且与仅查询我避免先查询,但我不能不再返回受影响的标识。但后来要求变更为
final StringBuilder logRevert;
参数已添加。
如果需要,哪些需要存储更新的id以将直接反向更新应用到数据库中。
但随着我的更新,我无法再让Ids不再。我的问题是,如何使用存储过程或数据库中的某种解决方法获取或返回受影响的ID或休眠我的意思是仅使用一个查询或增强代码获得第一个行为。
任何提示。
我已经试过
- 使用标准
- 使用HQL。
- 使用namedQuery
- 使用SqlQuery类
- 不使用变压器回到我原始的对象[]
但仍然多次在某种程度上高。
我想是这样
query.executeUpdate(); // RETURNS THE COUNT OF THE AFFECTED ROWS
但我需要在受影响的ID ......
很抱歉,如果这个问题很简单。
UPDATE
随着@德米特里 - senkovich我能做到这一点使用rawSQL但不是冬眠分离问题在这里提出。
https://stackoverflow.com/questions/44641851/java-hibernate-org-hibernate-exception-sqlgrammarexception-could-not-extract-re
如果要减少资源的使用,最大限度提高性能,你必须使用游标或存储过程(使用光标)如果你不关心浪费了一些周期,你的时钟是可靠的,你也可以改变你的算法首先进行更新。更新后,您可以通过使用时间戳,您为行设置,在我需要获取ID并在以后更新这些ID在哪里条款 –