2015-02-11 53 views

回答

0

正如您所提到的,可以從Criteria或QueryDSL或命名查詢(例如使用QueryTranslator)獲取生成的SQL查詢運行時,但不幸的是,對於內置方法例如save(),update()等。

生成SQL的唯一方法是(to see,更精確)是通過日誌記錄或數據庫監視工具。

雖然這是最受歡迎的功能之一,但到現在爲止它不是規範的一部分,所以它嚴格依賴於供應商的實現(和希望)。也就是說,至少在這一刻,Hibernate並沒有提供任何方式來獲取它。

0

如果你想定製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") 
1

有我所知,沒有這樣的選擇。更新/保存(插入)/刪除方法發佈懶惰。這是在十年前的早期考慮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的感覺非常有用,並且增加了對於它實際執行的控制。