当前位置: 首页 > 知识库问答 >
问题:

Hibernate:如何通过jpa.hibernate.ddl创建和执行sql过程-自动选项

薛望
2023-03-14

我有几个存储过程要作为初始设置执行。因此,我所做的是将该存储过程放置在data.sql中,并设置jpa.hibernate.ddl-auto=create

但是在我的springboot应用程序启动时,该应用程序由于com.mysql.jdbc.exceptions.jdbc4.mysqlSyntaxerRoreXception而失败。这意味着它不能理解该过程的语法,但是可以在SQL表单上手动执行相同的过程,不会有任何问题。那么如何通过data.sql执行它呢

data.sql-

DELIMITER $$

CREATE PROCEDURE `GetStocks`(int_stockcode varchar(20))
BEGIN
  DECLARE stock_name VARCHAR(100);
  SELECT name FROM stock where stock_code = int_stockcode INTO stock_name;
END $$

DELIMITER ;

错误-

原因:org.springframework.jdbc.datasource.init.ScriptStatementFailedException:

无法执行类路径资源[default-data.SQL]的SQL脚本语句#29:DELIMITER$$CREATE PROCEDUREgetstocks(int_stockcode varchar(20))BEGIN SELECT*FROM stock where stock_code=int_stockcode;嵌套异常是com.mysql.jdbc.exceptions.jdbc4.mysqlSyntaxerRoreXception:您的SQL语法有错误;查看与您的MySQL server版本相对应的手册,以了解在第1行“delimiter$$CREATE PROCEDUREgetstocks(int_stockcode varchar(20))BEGIN selec”附近使用的正确语法

共有1个答案

乜华翰
2023-03-14

对于加载和创建数据库对象,最好坚持使用liquibase或Flyway。使用以下代码可以加载存储过程。

使用控制器加载存储过程,但它可以是一个简单的类,也可以通过事件侦听器进行配置。

@RestController
public class SqlLoaderController {

    @Autowired
    DataSource dataSource;

    @GetMapping("/load")
    public void loadScript() throws Exception
    {

        ResourceDatabasePopulator resourceDatabasePopulator=new ResourceDatabasePopulator();
        resourceDatabasePopulator.setSeparator("DELIMITER");
        InputStream is= new ClassPathResource("sql.txt").getInputStream();
        resourceDatabasePopulator.addScript(new InputStreamResource(is));
        resourceDatabasePopulator.execute(dataSource);

    }
}

分隔符用于区分两个存储过程或数据库对象的开始和结束。sql.txt文件

CREATE PROCEDURE GetStocks(int_stockcode varchar(20))
BEGIN
  DECLARE stock_name VARCHAR(100);
  SELECT 1 FROM dual;
END;

DELIMITER

CREATE PROCEDURE GetStocks1(int_stockcode varchar(20))
BEGIN
  DECLARE stock_name VARCHAR(100);
  SELECT 1 FROM dual;
END;
DELIMITER
 类似资料:
  • 在我的Spring项目中,我使用HiberNate将我的实体类导出到以前创建的数据库。但是这需要最终用户知道如何在数据库管理器系统中创建数据库(目前我正在使用Postgreql)。 是否有任何方法,只要给定安装postgreql的机器(以及第一次运行应用程序时提供的用户名和密码),HiberNate在服务器中创建一个新数据库(如果它不存在)?

  • 我创建了一个小应用程序来下载youtube视频,并将它们添加到我的音乐文件夹中,这样我就可以通过spotify收听它们。只要我通过IDE运行该应用程序,它就可以正常工作。我创建了一个。exe文件通过pyinstaller,但它在启动时崩溃,我尝试以管理员身份运行它,也尝试按照其他线程中的建议通过cmd运行它,但没有任何效果。 我使用以下方法创建了它: 这是python代码: 这是我得到的,我试图通

  • 问题内容: 我正在使用hibernate模式开发应用程序。当我尝试创建登录页面时,出现Sql Injection问题。我有以下代码: 在这种情况下,如何防止Sql Injection?loginInfo表的创建表语法如下: 问题答案: 您还有其他选择,请参阅mkyong的这篇不错的文章。

  • 当创建maven项目时,需要做大量的工作来创建指定的父包。如:用groupId com.test和artifactId jpa-demo创建maven项目时,后面只需要创建包:src/main/java中的com.test.jpa.demo。 那么,如何自动创建这些PAC? 嗯。在IntelliJ Idea中没有找到有用的插件。 有人知道一个好主意吗?tks.

  • 问题内容: 我正在使用R包通过R访问我的PostgreSQL数据库(9.3)。我有一些非常长且较大的sql查询(从raster2pgsql生成的几个MB大。)。 如何在R中以语句形式发送/执行sql查询文件? 正常方式 似乎无法通过来工作。我试图通过读取整个sql文件作为字符向量,但是这也失败了,因为dbSendQuery显然仅支持单个命令? 问题答案: 或仅用于“ SQL”部分,而不是psql命

  • 问题内容: 我需要在通过JPA EntityManager访问的数据库中创建一个新表。JPA NativeQueries是否支持“选择”或“更新”以外的查询?还是在JPA上下文中还有另一种先进的方法来执行复杂的SQL查询? 问题答案: jpa“本机查询”仅可用于DML语句(数据处理语言)。要发布任何DDL(例如创建表),您需要从EntityManager获取基础连接。 如何从EM中提取连接将取决于