我有這樣的需求。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在哪裏條款 –