我有一个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
中所有字段的新空表我可以看到两种可能的解决方案
bean
。但我事先并不知道ResultSetMetaData
将包含哪些字段。我应该用反射创建这个bean
吗? 最简单的方法是什么?我该怎么做?
答案 0 :(得分:2)
我认为你不需要为它创建bean。如果要创建具有相同字段的新表,则使用hibernate或jdbc在数据库上简单地触发此查询。
SHOW CREATE TABLE tablename
现在只需在查询中更改表的名称,就可以用Java轻松完成。
现在您不需要为新创建的表创建任何bean。 在hibernate中有两种从表中获取数据的方法。第一种方式是以bean对象的形式获取表数据,另一种方式是fire sql查询并以Object(Java Class)的形式获取数据。你可以使用hibernate以Object和Object Array的形式获取数据。
当我们在hibernate中使用连接查询时,没有特定类型的bean可用于处理连接结果,因为它包含来自多个表的列,因此您将获得Object和Object Array形式的数据。
以对象或对象数组的形式获取数据。
检查我的github的这个链接...不完全是你想要的但仍然有用:
I hope I Helped you.
答案 1 :(得分:2)
我能想到的几个解决方案:
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 Query
- 正常情况通过您的元数据迭代以确定列应该是什么。
使用createSQLQuery甚至使用createNativeQuery
session.createSQLQuery("create table .....").executeUpdate();
此link提供了有关如何创建自定义字段的说明。您可以使用其DOM Parser进行第一种方法或仅创建表并使用此博客中提到的方法来创建自定义字段。 (请参阅此课程MappingManager
及其相关的自定义地图配置)
最后,您需要为此配置2个不同的数据源。并注入第二个数据库的源代码,用于在上述实现中创建session / sessionfactory。