2012-04-02 68 views
5

JPA2.0中的CriteriaQuery提供了一種類型安全的方式來做select,這很好。但我想知道爲什麼它不會提供更新/刪除操作?要批量更新/刪除,您必須回到過去編寫容易出錯的SQL或JPQL文本。 IMO,更新/刪除的CriteriaQuery不應該被證明是困難的,因爲where原因處理與select相同。爲什麼JPA CriteriaQuery不提供更新查詢?

希望這可以在下一個版本的JPA中實現。

+1

你的願望已經成真:)自JPA 2.1有'CriteriaUpdate'可用 – 2014-09-24 07:52:37

回答

1

由於JPA是ORM工具,其動機是將數據庫記錄映射到對象,以便可以使用編程語言而不是SQL來操作數據庫記錄,因此它不鼓勵使用SQL/HQL/JPQL執行更新。

爲了防止使用容易出錯的SQL或JPQL更新對象,一旦使用CriteriaQuery來檢索對象列表,可以簡單地遍歷結果對象,然後逐個更改對象的屬性爲了做批量更新或刪除。當調用EntityManager.flush()時,JPA應該能夠檢測對這些對象所做的更改並生成合適的SQL以更新批次中的相應記錄。

+4

這聽起來很合理。但它涉及至少兩個交易,如果記錄很大,例如刪除一百萬條記錄,這種方式是不可接受的。我只是認爲CriteriaQuery已經以SQL方式工作,指定了一些條件,然後完成了工作。爲什麼不支持這種風格的刪除/更新。無論如何,如果數量很大,我現在必須使用純SQL進行批量刪除/更新。 – 2012-04-03 00:35:58

+1

@zx_wing的有效點,這就是爲什麼JPA 2.1引入了「CriteriaUpdate」 – 2014-09-24 07:54:05

相關問題