如何在hibernate本机查询中使用MySQL assign运算符(:=)?
我正在使用Hibernate。 我写了一些原生查询,因为我需要使用sub select语句。
查询如下所示:
SELECT sub.rownum FROM (SELECT k.`news_master_id` AS id, @row := @row + 1 AS rownum FROM keyword_news_list k JOIN (SELECT @row := 0) r WHERE k.`keyword_news_id` = :kid ORDER BY k.`news_master_id` ASC) AS sub WHERE sub.id = :nid
当我像这样运行此查询时:
sessionFactory.getCurrentSession() .createSQLQuery(query) .setParameter("kid", kid) .setParameter("nid", nid) .uniqueResult();
出现此exception:
org.hibernate.QueryException: Space is not allowed after parameter prefix ':' ....
这可能是因为:=
运算符。 我发现了一些Hibernate问题 。 这个问题仍然存在。 这个问题没有解决办法吗?
你可以实现这是一个稍微不同的方式..你需要用其他东西替换:运算符(比如’|’char)并在你的拦截器中替换’|’ 与:。
这样,hibernate不会试图认为:是一个参数,但会忽略它
对于拦截器逻辑,您可以参考hibernate手册
这对我使用MySQL 5很有用。
记住,这个替换:必须只对’:=’和其他MySQL特定的要求做..不要试图替换:为param-placeholders。 (然后hibernate将无法识别params)
请注意, HHH-2697现在已针对Hibernate 4.1.3进行了修复,并在Hibernate 4.3.8.Final上进行了测试; 你必须用反斜杠逃脱:
SELECT k.`news_master_id` AS id, @row \:= @row + 1 AS rownum FROM keyword_news_list k JOIN (SELECT @row \:= 0) r WHERE k.`keyword_news_id` = :kid ORDER BY k.`news_master_id` ASC
对于我们这些无法跳转到Hibernate 4.1.3的人来说,这是另一种解决方案。
只需在查询中使用/*'*/:=/*'*/
。 Hibernate代码将'
作为字符串(忽略它)之间'
所有内容对待。 另一方面,MySQL会忽略blockquote中的所有内容,并将整个表达式计算为一个assignement运算符。
我知道这很快,很脏,但是没有存储过程,拦截器等就完成了工作。
我更喜欢包含Spring JDBC并执行查询而不是对抗Hibernate拦截器。
在遇到mysql的Hibernateexception中:=运算符 Stanislav给出了除拦截器之外的另一个选项来解决这个问题
我猜在=之后应该没有空格,运算符应该写成= :(没有任何空格)