如何在 Hibernate 中使用 Mysql 变量?
我需要在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
好吧,我最终使用存储过程(是的,我最初不想要的)来创建动态查询(我认为这是不可能的)。
这是我的代码:
存储过程:
提示是使用CONCAT函数在存储过程中动态创建查询。
然后,调用经典hibernate函数中的过程:
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:
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:
我将从 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.
在 Hibernate 发送数据后,使用 MySQL Proxy 重写查询查询数据库。
例如,为 Hibernate 提供这个,
但将其重写为这个,
Use MySQL Proxy to rewrite the query after Hibernate has sent the query to the database.
For example supply Hibernate with this,
but rewrite it to this,