Как использовать переменные Mysql с Hibernate? - PullRequest
3 голосов
/ 26 апреля 2010

Мне нужно использовать собственный SQL-запрос в Hibernate с использованием переменной.

Но hibernate выдает ошибку, говорящую: пробел не разрешен после префикса параметра

Таким образом, существует конфликт с назначением переменной: = mysql и назначением переменной спящего режима.

Вот мой sql запрос:

SET @rank:=0; 
UPDATE Rank SET rank_Level=@rank:=@rank+1 ORDER BY Level;

код гибернации (синтаксис jpa):

Query query = em.createNativeQuery(theQuery);
query.executeUpdate();

Я не могу использовать хранимую процедуру, потому что мой SQL-запрос генерируется динамически («Level» может быть «int» или «force» ...)

Как я могу это сделать?

спасибо

Ответы [ 3 ]

4 голосов
/ 26 апреля 2010

Ну, наконец, я использую хранимую процедуру (да, то, что я не хочу изначально) для создания динамического запроса (я не думаю, что это возможно).

Вот мой код: Хранимая процедура:

DELIMITER |

DROP PROCEDURE IF EXISTS UpdateRank |

CREATE PROCEDURE UpdateRank(IN shortcut varchar(30))
BEGIN
    SET @rank=0;
    SET @query=CONCAT('UPDATE Rank SET ', shortcut, '=@rank:=@rank+1 ORDER BY ', shortcut);     

    PREPARE q1 FROM @query;
    EXECUTE q1;
    DEALLOCATE PREPARE q1;
END;

|
DELIMITER ;

Подсказка - это использование функции CONCAT для динамического создания запроса в хранимой процедуре.

Затем вызовите процедуру в классической функции гибернации:

Query q = em.createNativeQuery("CALL updateRank('lvl')");
q.executeUpdate();
3 голосов
/ 28 августа 2014

Я скопирую и вставлю свой ответ из https://stackoverflow.com/a/25552002/3987202

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

0 голосов
/ 26 апреля 2010

Используйте MySQL Proxy , чтобы переписать запрос после того, как Hibernate отправил запрос в базу данных.

Например, снабдите Hibernate этим,

UPDATE Rank SET rank_Level=incr(@rank) ORDER BY Level;

но переписать это на это,

UPDATE Rank SET rank_Level=@rank:=@rank+1 ORDER BY Level;
...