2017-04-14 30 views
0

我想使用Spring的HibernateTemplate(Hibernate 5.1)執行數據庫批量更新。使用HibernateTemplate和IN子句批量更新

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異常
  • one of the most authoritative Hibernate sources所示,命名參數導致誤導性異常

問題是:我如何正確使用Spring的HibernateTemplate制定批量更新查詢?正如Mykong正確報告的那樣,HibernateTemplate自動設置查詢參數0爲基礎,但最終作者得到了程序使用非定位參數的工作,而沒有提及任何警告(或根本沒有)。

回答

2

我認爲現在推薦的方法是使用Spring Data JPA。有一個入門教程here

所以如果你有一個實體,你可以添加一個接口來擴展SpringDataJpa中支持的任何Reposiotry接口並添加一個修改查詢。

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

Here是我用來測試項目與

+0

感謝您指出Spring JPA。不幸的是,我不確定我們能夠很快在我們的體系結構中實現這一點(我正在開發的產品基於公司維護的,在所有開發人員之間共享的中間件)。我確實會與球隊討論這個問題,但現在我需要找到一個解決方案。查詢現在使用警告,所以我沒有被阻止。 –

+0

@ usr-local-ΕΨΗΕΛΩΝ可能您可以訪問entityManager/session並手動執行update語句。 –