使用Cassandra JDBC驱动时获取PK_NAME返回null的问题求助
问题分析与解决
1. 代码语法错误
你的代码存在do-while循环语法不完整的问题,缺少闭合的},修正后的代码如下:
try (ResultSet pk = metaData.getPrimaryKeys(catalog, schema, tableName)) { if (pk.next()) { String primaryKeyName; do { System.out.println(pk.getString("COLUMN_NAME")); primaryKeyName = pk.getString("PK_NAME"); System.out.println(primaryKeyName); } while (pk.next()); // 补上缺失的闭合大括号 } }
2. PK_NAME返回null的原因
Cassandra作为分布式NoSQL数据库,它的主键(包含分区键和聚类键)没有传统关系型数据库中的主键约束名称。Apache Simba的Cassandra JDBC驱动在实现getPrimaryKeys()方法时,由于Cassandra元数据中不存在对应PK_NAME的字段,所以该值会返回null,这属于驱动的正常行为。
3. 替代方案:获取完整主键信息
如果需要区分分区键和聚类键,可通过以下两种方式获取更精准的主键信息:
方法一:查询Cassandra系统表
执行SQL查询系统表system_schema.columns:
SELECT column_name, kind FROM system_schema.columns WHERE keyspace_name = ? AND table_name = ? AND kind IN ('partition_key', 'clustering') ORDER BY position;
partition_key对应分区键clustering对应聚类键
方法二:使用Simba驱动扩展元数据
Simba驱动提供了CassandraDatabaseMetaData类,可强制转换DatabaseMetaData实例获取Cassandra专属元数据:
if (metaData instanceof CassandraDatabaseMetaData) { CassandraDatabaseMetaData cassandraMetaData = (CassandraDatabaseMetaData) metaData; List<CassandraPrimaryKeyColumn> pkColumns = cassandraMetaData.getPrimaryKeyColumns(schema, tableName); for (CassandraPrimaryKeyColumn pkCol : pkColumns) { System.out.println("列名: " + pkCol.getColumnName()); System.out.println("主键类型: " + pkCol.getKeyType()); // 返回PARTITION_KEY或CLUSTERING_KEY } }
内容的提问来源于stack exchange,提问作者Arpit vij
相关产品推荐
相关产品推荐

