5

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

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

谢谢,

H

4

1 回答 1

2

派对迟到了,但我就是这样做的。这里需要注意几点:

  • 我的 SQL 文件(“sql-queries.sql”)位于类路径中 - 您可以通过任何其他方式执行此操作,以获得输入流...
  • 我的 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();
}
于 2017-08-10T18:41:44.020 回答