PostgreSQL中使用JDBC如何仅查询当前schema下的数据表
问题解答
原因说明
PostgreSQL官方JDBC驱动对getTables方法的schemaPattern参数处理存在和JDBC规范不一致的实现:传入空字符串""时并不会按规范要求只返回无schema的对象,而是会被驱动内部转为null处理,最终返回所有schema下的表。
纯JDBC标准实现方案
不需要编写PostgreSQL专属过滤逻辑,使用JDBC 4.1及以上版本提供的标准API即可实现需求,步骤如下:
- 先通过连接对象的标准
getSchema()方法获取当前连接生效的schema值,该值会自动读取你连接串中currentSchema参数配置的内容 - 将获取到的schema值作为
getTables方法的第二个参数(schemaPattern)传入即可
修改后代码示例
// 获取当前连接的生效schema String currentSchema = conn.getSchema(); final ResultSet rs2 = conn.getMetaData().getTables(null, currentSchema, null, new String[] { "TABLE" }); while (rs2.next()) { System .out.println(rs2.getString("TABLE_SCHEM") + "." + rs2.getString("TABLE_NAME")); }
兼容更低JDBC版本的补充方案
如果你的项目使用的JDBC版本低于4.1(JDK版本低于1.7),可以通过标准的JDBC查询语句获取当前schema:
Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT current_schema()"); String currentSchema = ""; if(rs.next()) { currentSchema = rs.getString(1); } // 后续同样将currentSchema传入getTables方法即可
内容的提问来源于stack exchange,提问作者basin
相关产品推荐
相关产品推荐

