【问题标题】:JPA Entity Manager - How to run SQL script file?JPA Entity Manager - 如何运行 SQL 脚本文件?
【发布时间】:2014-09-16 04:48:03
【问题描述】:

我有一个 SQL 脚本文件,它删除并重新创建各种表以及将各种记录插入这些表中。该脚本在 SQL 查询控制台中执行时运行良好,但我需要它由实体管理器执行。

关于我将如何做到这一点的任何想法?

谢谢,

H

【问题讨论】:

  • 您的主要问题是什么?你想以编程方式运行SQL Script FileEntityManager如何运行SQL Script File
  • 是的,所以我有一个包含大量 SQL 查询的 .sql 文件。我希望能够以编程方式运行此文件。

标签: sql jpa entitymanager sql-scripts drop-table


【解决方案1】:

聚会迟到了,但我是这样做的。这里有几点需要注意:

  • 我的 SQL 文件(“sql-queries.sql”)位于类路径中 - 您可以通过任何其他方式执行此操作,以获得输入流...
  • My SQL 文件每行有 1 条语句
  • 我正在手动开始/提交事务,文件中的每一行/语句一个

执行文件的方法如下:

void executeStatements(BufferedReader br, EntityManager entityManager) throws IOException {
    String line;
    while( (line = br.readLine()) != null )
    {
        entityManager.getTransaction().begin();
        entityManager.createNativeQuery(line).executeUpdate();
        entityManager.getTransaction().commit();
    }
}

我是这样称呼它的:

        InputStream sqlFileInputStream = Thread.currentThread().getContextClassLoader()
                .getResourceAsStream("geo-data.sql");

        // Convert input stream to something that can be read line-by-line

        BufferedReader sqlFileBufferedReader = new BufferedReader( new InputStreamReader(sqlFileInputStream));
        executeStatements(sqlFileBufferedReader, dao.getEntityManager());

我名义上用 1 个事务而不是每个语句 1 个进行测试(注意,这意味着 1 个错误的查询会破坏一切)并且执行时间是相同的:

void executeStatements(BufferedReader br, EntityManager entityManager) throws IOException {
    String line;
    entityManager.getTransaction().begin();
    while( (line = br.readLine()) != null )
    {
        entityManager.createNativeQuery(line).executeUpdate();
    }
    entityManager.getTransaction().commit();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 2022-01-27
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多