2010-09-14 59 views
9

我寫這個帖子知道是否有人知道如何做到這一點:休眠 - 自定義插入到數據庫

我想這樣做插入:

INSERT INTO TABLA (CAMPO1, CAMPO2) VALUES (?, crypt(?,'cdp')) 

地穴是存儲在我的數據庫功能,插入我想要在我的代碼中完成。其實當我想在數據庫中插入一些我使用:

getHibernateTemplate().persist(obj); 

但我想做一個「自定義」插入,因爲我需要使用該功能。

我使用休眠+註釋:

@org.hibernate.annotations.SQLInsert (sql = "INSERT INTO TABLA (CAMPO1, CAMPO2) VALUES (?, crypt(?,'cdp'))") 

但關鍵的「CDP」必須從文件中readed,所以這種解決方案並不爲我工作。

我想用我的代碼的方法來執行一個SQL查詢(INSERT查詢)

+0

這是否可以使用原始SQL(換句話說,讓我們把Hibernate放在一邊)?如果是的話,我不明白爲什麼'@ SQLInsert'不適合你。如果沒有,恐怕Hibernate不會幫忙。你能澄清嗎? – 2010-09-14 08:12:42

+0

不適用於我,因爲我需要使用加密密鑰來獲取字符串,所以我不知道如何將它引入@SQLInsert – Michel 2010-09-14 08:24:17

回答

15

這裏有一個解決方案:

Query query = getSession().createSQLQuery("INSERT INTO TABLA (CAMPO1, CAMPO2) VALUES (:valor1, encripta(:valor2, :key))"); 
query.setParameter("valor1", valor1); 
query.setParameter("valor2", valor2); 
query.setParameter("key", key); 
query.executeUpdate(); 
+7

,您不應該將字符串附加到您的sql語句中。最好使用命名參數。 – 2012-04-12 15:15:48

+1

@NathanFeger你的觀點很重要,我編輯了這個答案並加入它 – 2014-06-13 15:49:48

+0

有沒有一種方法來獲得生成鍵[如JDBC](http://stackoverflow.com/a/4224729/1652461)? – remi 2015-09-25 10:09:19

18

像內森Feger提到,命名參數更清潔,更安全。在這種情況下,可以使用以下代碼執行語句:

Query query = getSession().createSQLQuery("INSERT INTO TABLA (CAMPO1, CAMPO2) VALUES (:valor1, encripta(:valor2, :key))"); 
query.setParameter("valor1", valor1); 
query.setParameter("valor2", valor2); 
query.setParameter("key", key); 
query.executeUpdate(); 
+0

編輯Michel的答案來結合你的代碼。 – 2014-06-13 15:50:15