java - 使用 JPA Hibernate 创建 MySQL 存储过程

标签 java mysql hibernate jpa

我正在尝试使用文本文件的内容在 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/

相关文章:

php - 将 PHP 应用程序与 MySQL Fabric 连接(使用 php 感知连接器)

java - jpa中多对多关系中间表中的附加列

Java注解字段setter和getter如何

java - 堆栈和队列考试后续

Mysql查询字符串替换

mysql - 在其他列的定义中使用列名 "variable"

java - 为什么 Hibernate 重新实现数据库已有的功能?

java - Hibernate 在没有事务的情况下持久化

java - 未从 JTable 中删除的行

java - 从网络启动时列出可运行 jar 中的资源失败