DatabaseMetaData多个表

时间:2015-12-01 14:15:41

标签: java jdbc

我试图运行一个连接多个表的查询,然后我想用它从结果集中获取列名详细信息,比如名称等等(无论我能得到什么)。

使用没有连接的查询,我会做类似的事情:

DatabaseMetaData dmd = connection.getMetaData();
try (ResultSet rs = dmd.getColumns(null, null, tableName, null)) {
            while (rs.next()) {
                String columnName = rs.getString("COLUMN_NAME");
                String columnType = rs.getString("TYPE_NAME");
                Integer columnLength = rs.getInt("COLUMN_SIZE");
                Boolean columnPrimaryKey = false;
                ResultSet primaryKeysSet = columnMeta.getPrimaryKeys(null, null, clazz.getSimpleName());
                while (primaryKeysSet.next()) {
                    if (primaryKeysSet.getString(4).equalsIgnoreCase(columnName)) {
                        columnPrimaryKey = true;
                    }
                }
                Boolean columnNotNull = columnResultSet.getString("NULLABLE").equals("0");
            }
        }

但是,就dmd.getColumns(null, null, tableName, null)而言,我在获取tableName时会遇到问题,因为它有多个表格。

有没有办法从包含多个表连接的查询中获取列数据?

1 个答案:

答案 0 :(得分:0)

使用相同的原则,但在(加入)查询的ResultSet上调用getMetaData()

这里是简化示例 - 您应该使用preparedStatement

很抱歉使用Groovy - 但应该清楚如何传入Java

ResultSet rs = dmd.createStatement().executeQuery('select * from ta, tb')  // your join statement here
def rsmd = rs.getMetaData();
def colCount = rsmd.getColumnCount()

println "getColumnCount ${colCount}"

colCount.times {i ->
  println "---------------------------------"
  println "columnName ${rsmd.getColumnName(i+1)}"
  println "columnType ${rsmd.getColumnTypeName(i+1)}"
  println "Precision ${rsmd.getPrecision(i+1)}"
  println "Scale ${rsmd.getScale(i+1)}"
  println "isNullable ${rsmd.isNullable(i+1)}" 
  // Oracle extension
  println "isNCHAR ${rsmd.isNCHAR(i+1)}"  
  // print column value as String
  println rs.getString(i+1)
}