【问题标题】:JPA native query for "select into outfile"用于“选择到 outfile”的 JPA 本机查询
【发布时间】:2015-09-22 01:48:43
【问题描述】:

我在通过 JPA 本机查询执行“SELECT INTO outfile”查询时遇到问题。

我尝试了以下代码:

Query q = entityManager.createNativeQuery("SELECT * INTO OUTFILE '/tmp/temp.sql' FROM DummyTable");
return q.getResultList();

但我得到了这个例外:

原因:java.sql.SQLException:ResultSet 来自 UPDATE。没有数据。

似乎 JPA 将其视为更新,因此我将代码更改为使用执行更新:

Query q = entityManager.createNativeQuery("SELECT * INTO OUTFILE '/tmp/temp.sql' FROM DummyTable");
q.executeUpdate();

现在,我遇到了另一个例外。

原因:org.hibernate.exception.GenericJDBCException:不能 执行本机批量操作查询

原因:java.sql.SQLException: Can not issue executeUpdate() for 选择

有谁知道如何解决这个问题?谢谢!

【问题讨论】:

  • 您需要将查询视为更新,q.getResultList() 将尝试提取 ResultSet,当您执行转储(“select into outfile”)时,获得的结果是整数(或long) 表示写入文件的记录数。
  • 感谢您的评论。我确实尝试过使用 executeUpdate(),但结果出现了另一个异常。

标签: java mysql hibernate jpa


【解决方案1】:

找到了解决方法。使用直接 JDBC 解决了这个问题。

    Session session = (Session) entityManager.getDelegate();
    session.doWork(new Work() {

        @Override
        public void execute(Connection connection) throws SQLException {
            PreparedStatement pStmt = null;
            try {
                pStmt = connection.prepareStatement(query);
                pStmt.execute();
            } finally {
                if (pStmt != null) {
                    pStmt.close();
                }                       
            }

        }
    });

【讨论】:

    【解决方案2】:

    EntityManager.createQuery 创建 JPQL 查询接口,而EntityManager.createNativeQuery 将创建本机查询接口。

    您尝试执行的查询是本机查询。因此,如果您将其更改为 createNativeQuery 可能会解决问题。

    【讨论】:

    • 您好,感谢您的回答。我实际上确实使用了 createNativeQuery,但我在问题中输入错误。我现在就解决这个问题。
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2021-01-19
    • 2017-04-25
    • 1970-01-01
    • 2020-12-15
    • 2016-11-02
    相关资源
    最近更新 更多