用于“选择到 outfile”的 JPA 本机查询

Posted

技术标签:

【中文标题】用于“选择到 outfile”的 JPA 本机查询【英文标题】:JPA native query for "select into outfile" 【发布时间】: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(),但结果出现了另一个异常。 【参考方案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,但我在问题中输入错误。我现在就解决这个问题。

以上是关于用于“选择到 outfile”的 JPA 本机查询的主要内容,如果未能解决你的问题,请参考以下文章

JPA batch_size 属性不适用于本机查询

将jdbc查询转换为JPA本机查询

JPA 本机查询问题

JPA/Hibernate 本机查询无法识别参数

JPA 中的传递列表命名本机查询

JPA 和缓存本机 SQL 查询