在Hibernate中有規定,您可以從Criteria
How to get SQL from Hibernate Criteria API (*not* for logging)查詢但我想從休眠saveOrUpdate
和delete(Object)
獲得更新/刪除查詢,所以有沒有任何選項?如何從休眠saveOrUpdate(對象)(不用於日誌記錄)查詢
回答
正如您所提到的,可以從Criteria或QueryDSL或命名查詢(例如使用QueryTranslator
)獲取生成的SQL查詢運行時,但不幸的是,對於內置方法例如save(),update()等。
生成SQL的唯一方法是(to see
,更精確)是通過日誌記錄或數據庫監視工具。
雖然這是最受歡迎的功能之一,但到現在爲止它不是規範的一部分,所以它嚴格依賴於供應商的實現(和希望)。也就是說,至少在這一刻,Hibernate並沒有提供任何方式來獲取它。
如果你想定製UPDATE/DELETE語句,你可以簡單地提供your own CRUD DML語句:
@Entity
@Table(name="CHAOS")
@SQLInsert(sql="INSERT INTO CHAOS(size, name, nickname, id) VALUES(?,upper(?),?,?)")
@SQLUpdate(sql="UPDATE CHAOS SET size = ?, name = upper(?), nickname = ? WHERE id = ?")
@SQLDelete(sql="DELETE CHAOS WHERE id = ?") @SQLDeleteAll(sql="DELETE CHAOS")
有我所知,沒有這樣的選擇。更新/保存(插入)/刪除方法發佈懶惰。這是在十年前的早期考慮Hibernate的主要功能之一。
只有當選擇命中數據庫,發出刷新或發生提交時,Hibernate纔會發出更新/保存/刪除操作。然後Hibernate遍歷所有對象(及其圖)以檢查髒對象。出於骯髒,它會生成必需的SQL,並嘗試創建批次的更改。這使得可以節省連接時間並一次發送許多更改。如果您必須在同一個表中刪除/插入/更新很多行,它可以大大加快數據庫的訪問速度。
但是這使得從這樣的操作中接收到Hibernate生成的SQL是不可能的,因爲操作不存在,它只是POJO對象內的一個標記。
如果你想要SQL,你可以簡單地做兩件事。首先,您可以替換Driver實現並插入任何類型的日誌記錄(就像監視器工具一樣)。只需獲取當前的驅動程序實現的源代碼,並在您自己的類路徑中創建一個類+包並修改方法,如execute + setParameter。通過這種方式,您可以通過編程方式查看並使其可用SQL訪問數據庫,還可以替換結果集實現,並檢查代碼多長時間發出下一個和各種內容。
我用它進行單元測試,它運行良好。
-
第二種方法更簡單。您只需進入Hibernate的源代碼並親自查看它。如果Garvin(King)有一個特殊的特徵,那麼它就會寫出很好的可讀代碼。只有少數情況下你可以跟他爭論他的寫作方式(對我來說方法有點太長了),但在這個非常好的閱讀旁邊。所以如果你能得到Hibernates源代碼(這很容易),這是值得的閱讀。我花了一週的時間,我猜想Hibernate 3的消息來源,這是一種樂趣(Eclipse也是一個很好的閱讀)。
一旦你檢查了代碼,你會發現在構成SQL之前有類表示SQL,並且有Dialect對象和所有東西。調查他們,複製源代碼提供基於原始版本的自己的實現,並且可以監視存儲和訪問,甚至可以操縱導致最終SQL的所有事情,甚至可以在將SQL移交給數據庫驅動程序之前獲取SQL。
-
第一個選項適用於查看所有SQL。第二個選項對於獲得關於Hibernate的感覺非常有用,並且增加了對於它實際執行的控制。
- 1. 日誌記錄休眠查詢不起作用
- 2. 休眠SaveOrUpdate:如何使用
- 3. 休眠4.x日誌記錄配置
- 4. 休眠事務標識日誌記錄
- 5. 控制休眠日誌記錄
- 6. 休眠雙重日誌記錄
- 7. 如何配置休眠的JUnit測試公用日誌記錄
- 8. 休眠saveOrUpdate不更新
- 9. 從maven中禁用與休眠日誌記錄
- 10. 休眠saveOrUpdate行爲
- 11. 休眠日誌
- 12. Hql的查詢在休眠中類似於SaveOrUpdate
- 13. Python日誌記錄不工作 - 日誌記錄對象和sys.modules.pop()
- 14. 使用條件查詢對象休眠
- 15. Python日誌記錄對象
- 16. 休眠查詢日期大於
- 17. 休眠(4.3.11-Final)日誌記錄不橋接到log4j2?
- 18. wildfly休眠log4j的日誌記錄不工作
- 19. 休眠4蜻蜓8日誌記錄不工作
- 20. 如何使用休眠記錄最終的SQL查詢
- 21. 如何啓用休眠查詢計時記錄
- 22. 如何從休眠查詢中返回單個結果對象?
- 23. Hibernate查詢(不是SQL)日誌記錄
- 24. 休眠查詢獲取日期忽略年的記錄
- 25. 休眠掛起上saveOrUpdate
- 26. 有條件saveOrUpdate在休眠
- 27. 休眠saveOrUpdate大數據
- 28. 休眠saveorUpdate方法問題
- 29. 休眠SaveOrUpdate複合鍵
- 30. laravel禁用查詢日誌記錄