Как я могу использовать оператор присваивания MySQL (: =) в исходном запросе hibernate? - программирование
Подтвердить что ты не робот

Как я могу использовать оператор присваивания 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. Этот вопрос по-прежнему открыт. Разве нет решения для этой проблемы?

4b9b3361

Ответ 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.

Ответ 6

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