2010-04-26 88 views
2

我需要在Hibernate中使用原生SQL查詢並使用變量。如何在Hibernate中使用Mysql變量?

但休眠拋出一個錯誤說:空間參數前綴之後,是不允許

所以有與衝突:= mysql的變量賦值和休眠狀態變量賦值。

這裏是我的sql查詢:

SET @rank:=0; 
UPDATE Rank SET [email protected]:[email protected]+1 ORDER BY Level; 

休眠代碼(JPA語法):

Query query = em.createNativeQuery(theQuery); 
query.executeUpdate(); 

我不能使用存儲過程,因爲是動態生成的我的SQL查詢('水平'可以'int'或'force'...)

我該怎麼做?

感謝

+0

請添加Hibernate代碼。 – 2010-04-26 10:49:17

+0

我剛剛添加了它,但這是一個非常簡單的常見案例 – 2010-04-26 12:25:53

+1

您並不孤單, https://forum.hibernate.org/viewtopic.php?f=1&t=992931&start=0 http:// opensource。 atlassian.com/projects/hibernate/browse/HHH-2697 也許每個order by子句都有一個存儲過程。 – 2010-04-26 13:02:19

回答

4

好了,我終於可以用存儲過程(是的,我不想開始)至創建動態查詢(我不認爲這是可能的)。

這是我的代碼: 存儲過程:

DELIMITER | 

DROP PROCEDURE IF EXISTS UpdateRank | 

CREATE PROCEDURE UpdateRank(IN shortcut varchar(30)) 
BEGIN 
    SET @rank=0; 
    SET @query=CONCAT('UPDATE Rank SET ', shortcut, '[email protected]:[email protected]+1 ORDER BY ', shortcut);  

    PREPARE q1 FROM @query; 
    EXECUTE q1; 
    DEALLOCATE PREPARE q1; 
END; 

| 
DELIMITER ; 

尖端是使用CONCAT函數來動態地創建在存儲過程中的查詢。

然後,調用程序中的經典休眠功能:

Query q = em.createNativeQuery("CALL updateRank('lvl')"); 
q.executeUpdate(); 
+1

確保防止sql注入。 – 2010-04-26 14:50:41

+0

是的,你是對的,但我已經保護它(我的快捷鍵只是字母) – 2010-04-26 17:01:11

+1

我發現更好的方法來解決這個問題與Hibernate攔截器http://stackoverflow.com/questions/9460018/how-can-i - 使用MySQL的指派,運營商在冬眠本地查詢。如果有替代方案,我認爲使用存儲過程是非常糟糕的想法。 – 2012-02-29 02:34:24

0

使用MySQL Proxy重寫查詢休眠發送了查詢數據庫之後。

例如供應這種休眠,

UPDATE Rank SET rank_Level=incr(@rank) ORDER BY Level; 

但它改寫此,

UPDATE Rank SET [email protected]:[email protected]+1 ORDER BY Level; 
+0

這是一個有點棘手... – 2010-04-26 14:38:11

+0

如何愚蠢是胡言亂語? – droope 2012-11-08 22:17:55

3

我會複製粘貼我的回答從https://stackoverflow.com/a/25552002/3987202

另一種解決方案對我們這些誰不能做跳躍到Hibernate 4.1。 3。
只需在查詢中使用/*'*/:=/*'*/即可。 Hibernate代碼將'之間的所有內容視爲一個字符串(忽略它)。另一方面,MySQL將忽略blockquote中的所有內容,並將整個表達式評估爲分配運算符。
我知道這是快速和骯髒的,但它得到的工作沒有存儲過程,攔截器等完成

+0

這給我修好了。謝謝! – 2016-06-21 19:35:37

相關問題