在Java中是否有一种简单或直接的方法可以将DB Query的结果输出到文件(csv,tab等)。甚至在Hibernate中也许?
我知道可以将查询结果转储到数据库服务器上的平面文件中。我正在寻找一种应用程序可以运行查询并将这些结果存入文件的方法。
我意识到一个选项是迭代结果集并一次输出一行与分隔符分隔的记录。但如果有内置方式或Hibernate方式 - 那会更好!
我真正想要的是在代码中执行此操作的方法(例如 - 在应用程序运行时)。这样,服务器可以接受查询,对数据库运行它,将输出发送到平面文件。
发送查询的服务器并不真正需要文件本身,只是知道它有效。因此,如果有SQL(对于Oracle DB)可以将输出重定向到Oracle DB Server可以访问的目录中的平面文件 - 这也可以。我实际上不必在Java Server中编写文件 - 只是根据它的查询触发文件创建。
希望这是有道理的。
答案 0 :(得分:1)
您可以将Session的EntityMode更改为“DOM4J”,以便Hibernate将返回表示为XML文档的数据而不是POJO图。
xmlSession = session.getSession(EntityMode.DOM4J);
Element elem = (Element) xmlSession.load(SomePersistentClass.class, id);
System.out.println(elem.asXML());
然后,您可以轻松地将其写入文件系统或进行后续转换。
答案 1 :(得分:0)
我似乎记得IntelliJ的JDBC db explorer能够导出查询结果。如果Eclipse或Netbeans DB插件或者可以做同样的事情,我不会感到惊讶。这是一大堆open source clients。
还有JdbcTool,这是一个命令行客户端
答案 2 :(得分:0)
我意识到一个选项是迭代结果集并一次输出一行与分隔符分隔的记录。但如果有内置方式或Hibernate方式 - 那就更好了!
不,没有。但它很容易非常:
public void printToFile( ResultSet rs, String path ) throws IOException {
PrintStream out = new FileOutputStream( path );
int cols = rs.getMetaData().getColumnCount();
while( rs.next() ) {
for( int i = 0; i < cols ; i++ ) {
out.printf("%s,", rs.getObject( i ) );
}
out.println();
}
// add exception handling and such...
// or move the from here.
out.close();
rs.close();
}
然后像这样称呼它:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM TABLE2");
printToFile( rs, "/some/file" );
这只是从头开始,你需要将文件和rs的关闭移动到更有意义的东西。
因此,如果有SQL(对于Oracle数据库)可以将输出重定向到Oracle DB Server可以访问的目录中的平面文件 - 这也可以工作
我认为这确实是可能的。但是,我远没有成为一名DBA,所以我不知道“怎么做”。
答案 3 :(得分:0)
也改为
for( int i = 1; i < cols ; i++ ) {
out.printf("%s,", rs.getObject( i ) );
}