在PostgreSQL JDBC中设置模式似乎不起作用
我用表“user”创建了模式“customer1”,我正在尝试使用Connection.setSchema()从JDBC连接它:
String url = "jdbc:postgresql://localhost/project"; Properties props = new Properties(); props.setProperty("user", "postgres"); props.setProperty("password", "postgres"); try (Connection conn = DriverManager.getConnection(url, props)) { conn.setSchema("customer1"); try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SHOW search_path")) { rs.next(); System.out.println("search_path: " + rs.getString(1)); } try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT name FROM user LIMIT 1")) { if (rs.next()) { System.out.println("user name: " + rs.getString("name")); } } }
此代码打印:
search_path: customer1
然后它会抛出PSQLException并带有消息:
ERROR: column "name" does not exist
如果我在SELECT查询中限定“user”表:
try (Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT name FROM customer1.user LIMIT 1")) { if (rs.next()) { System.out.println("user name: " + rs.getString("name")); } }
然后打印:
search_path: customer1 user name: name1
并且没有错误发生。 我正在使用JDBC驱动程序42.2.2和PostgreSQL服务器10.4。 为什么设置架构不起作用?
user
是内置函数 (和关键字)。 所以你不能真正将它用作表名:
psql (10.4) Type "help" for help. postgres=# select user; user ---------- postgres (1 row) postgres=# select * from user; user ---------- postgres (1 row)
因为它是一个函数,所以它没有列name
。
postgres=# select name from user; ERROR: column "name" does not exist LINE 1: select name from user; ^ postgres=#
如果您对表进行限定,那么很明显您没有引用该函数,而是表。
您可以始终使用架构限定表名,也可以使用双引号 : select name from "user";
或者只是找到一个不与内置函数冲突的表名。
- JPA / Hibernate静态元模型属性未填充 – NullPointerException
- Jetty 7 + MySQL Config
- 设计模式在java中使用数百个if else实现业务规则
- Itext7生成带有exception的pdf“Pdf间接对象属于其他PDF文档。 将对象复制到当前的pdf文档。“
- Spring / Hibernate中适当的缓存使用
- 从sqlite数据库中的列返回名称
- unit testingSpring MissingServletRequestParameterException JSON响应
- 如何在Oracle中使用JPA存储日期和时间?
- 如何在arquillian服务部署中添加库?