Как я могу использовать оператор присваивания MySQL (: =) в исходном запросе hibernate?
Я использую Hibernate. Я написал некоторый собственный запрос, потому что мне нужно использовать операцию выбора sub.
Запрос выглядит следующим образом:
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 issue. Этот вопрос по-прежнему открыт. Разве нет решения для этой проблемы?
Ответы
Ответ 1
вы можете реализовать это несколько иначе.. вам нужно заменить оператор: чем-то другим (например, '|' char), а в вашем перехватчике заменить '|' с:.
Таким образом, hibernate не будет пытаться думать, что: является параметром, но будет игнорировать его
Для логики перехватчика вы можете обратиться к руководству hibernate
Это работало для меня с использованием MySQL 5.
помните, что эта замена: должна выполняться только с помощью:: = и других требований к MySQL. Не пытайтесь заменить: для param-placeholders. (спящий режим не сможет идентифицировать параметры тогда)
Ответ 2
Обратите внимание, что 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
Ответ 3
Другое решение для тех из нас, кто не может совершить прыжок в Hibernate 4.1.3.
Просто используйте /*'*/:=/*'*/
внутри запроса. Спящий код обрабатывает все между '
как строку (игнорирует ее). MySQL, с другой стороны, будет игнорировать все внутри blockquote и будет оценивать все выражение для оператора присваивания.
Я знаю это быстро и грязно, но он выполняет свою работу без хранимых процедур, перехватчиков и т.д.
Ответ 4
Я предпочитаю включать Spring JDBC и выполнять запрос, а не сражаться с перехватчиками Hibernate.
Ответ 5
in Исключение Hibernate при столкновении с mysql: = operator Станислав дал другой вариант, отличный от перехватчика, для решения этой проблемы
Ответ 6
Я думаю, не должно быть пробела после =, оператор должен быть записан как =: (без пробелов)