How can I use MySQL assign operator(:=) in hibernate native query?

坚强是说给别人听的谎言 提交于 2019-11-26 09:53:48

问题


I\'m using Hibernate. I wrote some native query because I need to use sub select statement.

Query looks like this:

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

When I run this query like this:

sessionFactory.getCurrentSession()
    .createSQLQuery(query)
    .setParameter(\"kid\", kid)
    .setParameter(\"nid\", nid)
    .uniqueResult();

This exception comes out:

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

This might because of := operator. I found some Hibernate issue about this. This issue is still open. Isn\'t there any solution for this problem?


回答1:


you can implement this is a slightly different way.. you need to replace the : operator with something else (say '|' char ) and in your interceptor replace the '|' with the : .

this way hibernate will not try to think the : is a param but will ignore it

For the interceptor logic you can refer to the hibernate manual

This has worked for me using MySQL 5.

remember, this replacing of : must be only done to ':=' and other MySQL specific requirments.. don't try to replace the : for the param-placeholders. (hibernate will not be able to identify the params then)




回答2:


Note that HHH-2697 is now fixed for Hibernate 4.1.3 and tested on Hibernate 4.3.8.Final; You have to escape with backslash:

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



回答3:


Another solution for those of us who can't make the jump to Hibernate 4.1.3.
Simply use /*'*/:=/*'*/ inside the query. Hibernate code treats everything between ' as a string (ignores it). MySQL on the other hand will ignore everything inside a blockquote and will evaluate the whole expression to an assignement operator.
I know it's quick and dirty, but it get's the job done without stored procedures, interceptors etc.




回答4:


I prefer to include Spring JDBC and execute the query rather than fight against Hibernate interceptors.




回答5:


in Hibernate exception on encountering mysql := operator Stanislav gave another option other than interceptor to solve this issue




回答6:


I guess there should not be a space after = , the operator should be written as =: (without any spaces)



来源:https://stackoverflow.com/questions/9460018/how-can-i-use-mysql-assign-operator-in-hibernate-native-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!