我正在尝试使用文本文件的内容在 MySQL 数据库中创建一个存储过程:
USE myDatabase;
DROP PROCEDURE IF EXISTS myStoredProcedure;
DELIMITER $$
CREATE PROCEDURE myStoredProcedure
(
_description VARCHAR(50),
_value INT
)
BEGIN
INSERT INTO myTable
(
description,
value
) VALUES (
_description,
_value
);
SELECT
id,
description,
value
FROM myTable
WHERE id = LAST_INSERT_ID();
END;
$$
DELIMITER ;
我使用 native 查询执行 SQL:
Query query = entityManager.createNativeQuery(queryText);
...
query.executeUpdate();
但是它在 DROP PROCEDURE 上出错 我注释掉了 DROP PROCEDURE 然后它在 DELIMITER 上出错 基本上,它在第一个分号后的任何行上都会出错。
似乎 JPA hibernate 正在解析我的查询并告诉我它有问题,而不是将纯文本传递到 MySQL。
sql在MySQL中运行没有报错。
我在 Google 中找不到任何关于使用 JPA 创建存储过程的信息,只能调用一个。
有没有人知道我可能做错了什么?或者如果这可能的话。
最佳答案
如果你在 url 中提到以下属性,这是可能的
spring.datasource.url=jdbc:mysql://localhost:3306/test?allowMultiQueries=true
allowMultiQueries 将指示驱动程序向数据库发送分隔查询。
请注意,如果您使用 native 查询,请注意 sql 注入(inject)攻击。 您不需要显式地放置定界符(DELIMITER)。sql 语句 以下查询有效
SET myDatabase;
DROP PROCEDURE IF EXISTS myStoredProcedure;
CREATE PROCEDURE myStoredProcedure ( _description VARCHAR(50), _value INT )
BEGIN
INSERT INTO
myTable ( description, value )
VALUES ( _description, _value );
SELECT id, description, value
FROM myTable
WHERE id = LAST_INSERT_ID();
END;
关于java - 使用 JPA Hibernate 创建 MySQL 存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56483637/