用于“选择到 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 本机查询的主要内容,如果未能解决你的问题,请参考以下文章