如何在休眠原生查询中使用MySQL分配运算符(:=)?

2022-09-01 20:17:54

我正在使用Hibernate。我写了一些原生查询,因为我需要使用子选择语句。

查询如下所示:

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();

这个例外出现了:

org.hibernate.QueryException: Space is not allowed after parameter prefix ':' ....

这可能是因为操作员。我发现了一些关于此的Hibernate问题。此问题仍处于打开状态。这个问题没有任何解决方案吗?:=


答案 1

请注意,HHH-2697 现已在 Hibernate 4.1.3 中修复,您现在可以使用反斜杠转义:

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

答案 2

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


推荐