一尘不染

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

mysql

我正在使用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();

出现此异常:

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

这可能是因为:=运算符。我发现了一些与此有关的Hibernate问题。这个问题仍然存在。这个问题没有解决办法吗?


阅读 243

收藏
2020-05-17

共1个答案

一尘不染

您可以用一种稍微不同的方法来实现。.您需要将:运算符替换为其他内容(例如’|’char),然后在拦截器中替换’|’。与:。

这样,hibernate状态将不会尝试认为:是一个参数,但是会忽略它

有关拦截器逻辑,请参阅hibernate手册。

这对我使用MySQL 5很有用。

请记住,:的这种替换只能对’:=’和其他MySQL特定要求进行。.不要试图将:替换为param-placeholders。(然后,hibernate将无法识别参数)

2020-05-17