如何在 Hibernate 中使用 Mysql 变量?

发布于 2024-08-30 02:56:30 字数 485 浏览 2 评论 0原文

我需要在 Hibernate 中使用本机 sql 查询并使用变量。

但是hibernate抛出一个错误说:Space is not allowed afterparameter prefix

因此,:= mysql变量赋值和hibernate变量赋值存在冲突。

这是我的sql查询:

SET @rank:=0; 
UPDATE Rank SET rank_Level=@rank:=@rank+1 ORDER BY Level;

hibernate代码(jpa语法):

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

我无法使用存储过程,因为我的sql查询是动态生成的(“Level”可以是“int”或“force”...)

我该怎么办这 ?

谢谢

I need to use a native sql query in Hibernate with use of variable.

But hibernate throws an error saying: Space is not allowed after parameter prefix

So there is a conflict with the := mysql variable assignment and hibernate variable assignment.

Here is my sql query:

SET @rank:=0; 
UPDATE Rank SET rank_Level=@rank:=@rank+1 ORDER BY Level;

the hibernate code (jpa syntax):

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

I can't use a stored procedure because my sql query is dynamically generated ('Level' can be 'int' or 'force'...)

How can I do this ?

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

黎夕旧梦 2024-09-06 02:56:30

好吧,我最终使用存储过程(是的,我最初不想要的)来创建动态查询(我认为这是不可能的)。

这是我的代码:
存储过程:

DELIMITER |

DROP PROCEDURE IF EXISTS UpdateRank |

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

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

|
DELIMITER ;

提示是使用CONCAT函数在存储过程中动态创建查询。

然后,调用经典hibernate函数中的过程:

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

Well, I finally use stored procedure (yes, what I don't want initially) to create dynamic query (I don't think it was possible).

Here is my code:
The stored procedure:

DELIMITER |

DROP PROCEDURE IF EXISTS UpdateRank |

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

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

|
DELIMITER ;

The tip is the use of the CONCAT function to dynamically create a query in the stored procedure.

Then, call the procedure in classic hibernate function:

Query q = em.createNativeQuery("CALL updateRank('lvl')");
q.executeUpdate();
青衫负雪 2024-09-06 02:56:30

我将从 https://stackoverflow.com/a/25552002/3987202 复制粘贴我的答案

对于我们这些无法跳转到 Hibernate 4.1.3 的人来说,这是另一个解决方案。
只需在查询中使用 /*'*/:=/*'*/ 即可。 Hibernate 代码将 ' 之间的所有内容视为字符串(忽略它)。另一方面,MySQL 将忽略块引用内的所有内容,并将整个表达式计算为赋值运算符。
我知道它又快又脏,但它不需要存储过程、拦截器等就能完成工作。

I'll copy paste my answer from https://stackoverflow.com/a/25552002/3987202

Another solution for those of us who can't make the jump to Hibernate 4.1.3.
Simply use /*'*/:=/*'*/ inside the query. Hibernate code treats everything between ' as a string (ignores it). MySQL on the other hand will ignore everything inside a blockquote and will evaluate the whole expression to an assignement operator.
I know it's quick and dirty, but it get's the job done without stored procedures, interceptors etc.

橘亓 2024-09-06 02:56:30

在 Hibernate 发送数据后,使用 MySQL Proxy 重写查询查询数据库。

例如,为 Hibernate 提供这个,

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

但将其重写为这个,

UPDATE Rank SET rank_Level=@rank:=@rank+1 ORDER BY Level;

Use MySQL Proxy to rewrite the query after Hibernate has sent the query to the database.

For example supply Hibernate with this,

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

but rewrite it to this,

UPDATE Rank SET rank_Level=@rank:=@rank+1 ORDER BY Level;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文