我有一个 ResultSetMetaData
对象。
PreparedStatement ps=con.prepareStatement("select var1, var2 from test1, test2");
ResultSet rs=ps.executeQuery();
ResultSetMetaData rsmd=rs.getMetaData();
System.out.println("Total columns: "+rsmd.getColumnCount());
System.out.println("Column Name of 1st column: "+rsmd.getColumnName(1));
System.out.println("Column Type Name of 1st column: "+rsmd.getColumnTypeName(1));
我需要创建一个新的空表,其中包含上述 ResultSetMetaData 中的所有字段
- 在不同的数据库中打开新连接
- 使用上面的元数据
- 使用此元数据创建一个新空表
我可以看到两种可能的解决方案
- 反射(reflection)。一般来说,要使用 Hibernate 创建表,我需要创建一个
bean
。但我事先并不知道ResultSetMetaData
将包含哪些字段。我应该用反射创建这个bean
吗? - HQL 创建表。这可能吗?
最简单的方法是什么?我该如何做到这一点?
最佳答案
我能想到的几个解决方案:
SchemaExport
- 迭代 ResultSetMetaData,它公开 API,如 getColumnName和 getColumnType获取您需要的信息。
使用此信息创建一个 hibernate 映射 XML 并将其发送到 SchemaExport.create .// yourClassMapper.xml generated in runtime Configuration config = new Configuration(); config.addResource("yourClassMapper.xml"); new SchemaExport(config).create(true,true)
native 查询
- 像往常一样迭代元数据以找出列应该是什么。
使用createSQLQuery甚至使用 createNativeQuerysession.createSQLQuery("create table .....").executeUpdate();
这个link提供有关如何创建自定义字段的说明。您可以使用其 DOM 解析器作为第一种方法,或者仅创建表并使用本博客中提到的方法来创建自定义字段。 (引用该类
MappingManager
及其相关的自定义 map 配置)
最后,您需要为此配置 2 个不同的数据源。并在上述实现中注入(inject)第二个数据库的源来创建 session / session 工厂。
关于java - hibernate 。如何从 ResultSetMetaData 创建空表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41734719/