关于您的问题以及解决方案的一些想法(希望有所帮助):
在我与具有主键信息的结果集元数据一起工作的生涯经验中,我从未想过这个问题。
这对我来说甚至很奇怪,因为原则上,结果集不限于仅显示一个表中以列组织的行,并且不强制显示一个表的所有列,甚至这些列可能不是表列。
例如,我们可能会发出像这样的查询:
select X.a, X.b, Y.n, Y.m, 'bla'||X.c||'blub'||Y.l from X, Y;
在这种情况下,我们可能有一个或者两个表中的一个或两个表都没有主键列。
正如您已经知道的那样,标准的ResultSetMetaData
接口不提供主键信息的访问。在调试器中看到的是实现该接口的类的实例。
有几种方法来处理您的任务:
(不是我首选的方法)
将其强制类型转换为特定的实现ResultSetMetaData
类并访问主键信息(如果可用)。但要注意,并非每个
ResultSetMetaData
实现都提供此信息。
(稍微具有架构性的方法, 也不是我的建议, 但如果我们使用不完整的JDBC驱动程序,则需要)
利用您使用的不同数据库的系统表,但当然隐藏在抽象中,例如桥接模式。
根据您拥有的授权,通常不是什么大问题
(包括基础架构部分最多需要4人天的工作以及每个要访问的数据库系统约1人天的测试)然后您可以从中获取任何所需的元数据信息,包括外键关系。
(我所做的)
只需使用Java.sql.DatabaseMetaData
类
它为每个可访问表提供所需的主键信息,以及其他信息。
这里是一个Java 7的代码片段:
public static Set<String> getPrimaryKeyColumnsForTable(Connection connection, String tableName) throws SQLException {
try(ResultSet pkColumns= connection.getMetaData().getPrimaryKeys(null,null,tableName);) {
SortedSet<String> pkColumnSet = new TreeSet<>();
while(pkColumns.next()) {
String pkColumnName = pkColumns.getString("COLUMN_NAME");
Integer pkPosition = pkColumns.getInt("KEY_SEQ");
out.println(""+pkColumnName+" is the "+pkPosition+". column of the primary key of the table "+tableName);
pkColumnSet.add(pkColumnName);
}
return pkColumnSet;
}
ResultSetMetaData
的文档 http://docs.oracle.com/javase/7/docs/api/java/sql/ResultSetMetaData.html - Rookie007