如何在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给出了除拦截器之外的另一个选项来解决这个问题

我猜在=之后应该没有空格,运算符应该写成= :(没有任何空格)