Как я могу использовать оператор присваивания MySQL (: =) в собственном запросе гибернации? - PullRequest
18 голосов
/ 27 февраля 2012

Я использую 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 по этому поводу. Этот вопрос все еще открыт. Нет ли решения этой проблемы?

Ответы [ 6 ]

25 голосов
/ 29 июля 2012

Обратите внимание, что 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
15 голосов
/ 28 августа 2014

Еще одно решение для тех из нас, кто не может перейти на Hibernate 4.1.3.
Просто используйте /*'*/:=/*'*/ внутри запроса. Код Hibernate обрабатывает все, что находится между ', как строку (игнорирует ее). MySQL, с другой стороны, будет игнорировать все, что находится внутри кавычек, и будет оценивать все выражение для оператора присваивания.
Я знаю, что он быстрый и грязный, но он выполняет свою работу без хранимых процедур, перехватчиков и т. Д.

5 голосов
/ 27 февраля 2012

Вы можете реализовать это немного по-другому. Вам нужно заменить оператор: чем-то другим (скажем, '|' char) и в вашем перехватчике заменить '|'с помощью.

Это сработало для меня, используя MySQL 5.

помните, что замена: должна быть сделана только для ': =' и других специфических требований MySQL .. не пытайтесь заменить: для параметров-заполнителей.(Hibernate не сможет определить параметры тогда)

0 голосов
/ 21 октября 2015

in Исключение гибернации при обнаружении mysql: = operator Станислав дал другой вариант, кроме перехватчика, для решения этой проблемы

0 голосов
/ 04 июля 2013

Я предпочитаю включать Spring JDBC и выполнять запрос, а не бороться с перехватчиками Hibernate.

0 голосов
/ 27 февраля 2012

Я думаю, после = не должно быть пробела, оператор должен быть записан как =: (без пробелов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...