sql—将数据表中的数据提取到jpa中的文本文件中

3lxsmp7m  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(294)

我正在处理数据操作,我的命令是将表的所有内容提取到一个文本文件中!我已经实现了这一点,但是很明显,我在创建请求时犯了一个错误:

public void extractDonneesFichierPlat(){
    TypedQuery<NotificationCnavOP> query = entityManager.createQuery("SELECT * INTO OUTFILE 'C:\\Test.txt' FROM NotificationCnavOP", NotificationCnavOP.class);
}
ovfsdjhp

ovfsdjhp1#

在jpql中不能使用“select*into outfile…”语法,这是一种不同于sql的独立查询语言。如果要在jpa中执行本机sql查询,必须使用 entityManager.createNativeQuery() 方法。但仍然不可能使用这种方法执行这种“批量操作”查询。我能想到的唯一解决方案是使用jdbc而不是jpa并执行:

Object o = entityManager.getDelegate();
    System.out.println(o.getClass()); //prints the object class
    // in my case it is org.hibernate.internal.SessionImpl
    SessionImpl s = (SessionImpl)o;
    Connection c = s.connection();
    try {    
        Statement stmt = c.createStatement();
        stmt.executeQuery("SELECT * INTO OUTFILE 'C:/Test.txt' FROM NotificationCnavOP");
    } catch (SQLException e) {
        e.printStackTrace();
    }

实际执行 Session 取决于提供商。在休眠的情况下,它是 org.hibernate.internal.SessionImpl .
对于更新版本的hibernate,它是 org.hibernate.Session 而且它没有 connection() 方法。所以,你应该试试:

Object o = entityManager.getDelegate();
    Session s = (Session)o;

    s.doWork(connection -> {
        try {    
            Statement stmt = connection.createStatement();
            stmt.executeQuery("SELECT * INTO OUTFILE 'C:/Test2.txt' FROM NotificationCnavOP");
        } catch (SQLException e) {
            e.printStackTrace();
        }
    });

两个版本都在Hibernate4中工作。

相关问题