如何在hibernate本机查询中使用MySQL assign运算符(:=)?

San*_*Lee 18 java mysql hibernate nativequery

我正在使用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
Run Code Online (Sandbox Code Playgroud)

当我像这样运行此查询时:

sessionFactory.getCurrentSession()
    .createSQLQuery(query)
    .setParameter("kid", kid)
    .setParameter("nid", nid)
    .uniqueResult();
Run Code Online (Sandbox Code Playgroud)

出现此异常:

org.hibernate.QueryException: Space is not allowed after parameter prefix ':' ....
Run Code Online (Sandbox Code Playgroud)

这可能是因为:=操作员.我发现了一些Hibernate问题.这个问题仍然存在.这个问题没有解决办法吗?

Ond*_*žka 25

请注意,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
Run Code Online (Sandbox Code Playgroud)

  • 使用**Hibernate 4.3.7只有一个反斜杠就足够**,例如PG 9.3查询`select f(p_tst \:= 1)`(在Java字符串中它可能是两个以逃避它们) (3认同)

小智 15

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


Ana*_*rma 5

你可以实现这是一个稍微不同的方式..你需要用其他东西替换:运算符(比如'|'char)并在你的拦截器中替换'|' 与:.

这样,hibernate不会试图认为:是一个参数但会忽略它

对于拦截器逻辑,您可以参考hibernate手册

这对我使用MySQL 5很有用.

记住,这个替换:必须只对':='和其他MySQL特定的要求进行..不要试图替换:为param-placeholders.(然后hibernate将无法识别params)

  • 傻瓜如何休息?我可以想象编码员会去.不,怎么可能在SQL中冒号.没有机会!让我们做到这一点,没有逃避机制! (6认同)