JDBC 将我的 postgres 查询中的表大写
Posted
技术标签:
【中文标题】JDBC 将我的 postgres 查询中的表大写【英文标题】:JDBC capitalizing the table in my postgres query 【发布时间】:2012-02-08 23:02:52 【问题描述】:我正在运行以下代码
/**
* @param args
*/
public static void main(String[] args) throws SQLException
System.out.println("starting");
org.postgresql.Driver driver = new org.postgresql.Driver();
DriverManager.registerDriver(driver);
Connection con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/epcfe/", "postgres", "aap123!");
Statement st = con.createStatement();
st.executeQuery("select * from epcfeschema.PRODUCT");
System.out.println("done");
我不断收到Exception in thread "main" org.postgresql.util.PSQLException: ERROR: relation "epcfeschema.product" does not exist
如果我创建一个使用小写名称 product 的表,这可以正常工作,但我需要它才能用于所有大写的表。如何防止 JDBC 小写我的表?
【问题讨论】:
实际上可能是 PostgreSQL。 PG 默认对模式对象不区分大小写;尝试在表名周围加上双引号,看看是否能解决问题。 但我需要它来处理所有大写的表格。为什么会这样? @Daniel:实际上是 SQL 标准指定不带引号的标识符不区分大小写,而不是 PostgreSQL;该标准还规定,未加引号的标识符应规范化为大写,但 PostgreSQL 规范化为小写。 @muistooshort 谢谢;我通常假设 PG 遵循标准,有趣的是它不遵循的情况。 【参考方案1】:如果是休眠问题,试试这个:
@Entity
@Table(name = "\"PRODUCT\"")
public class Product // ...
或者更好的是,让您的生活更轻松:登录 postgres 并重命名表!
ALTER TABLE "PRODUCT" rename to product;
(当然,其他代码可能取决于帽子名称...)
【讨论】:
重命名将使表名不区分大小写,因此任何依赖于大写名称的代码仍然有效。 是的,这正是我的问题。并且有很多代码已经依赖于它是资本,所以我们最终可能会将其设为小写,但感谢您的快速修复。 :) Hibernate 至少曾经是这样,如果您在表/列名周围使用反引号,它们会被翻译成特定方言的引号【参考方案2】:您很可能使用双引号创建表格,例如:
create table "PRODUCTS" (
...
)
这使得表名区分大小写(根据 SQL 标准),因此每次访问表时都需要使用双引号。
select * from epcfeschema."PRODUCT"
因此你必须使用:
executeQuery("select * from epcfeschema.\"PRODUCT\"");
在您的 Java 代码中(如 ChssPly76 所示)。
我强烈建议重新创建不带双引号的表格,以使其不区分大小写。然后你永远不需要它们,你永远不必担心用大写、小写或混合大小写来写它们:
使用时
create table PRODUCTS (
...
)
以下所有语句都将起作用:
select * from Products;
select * from PRODUCTS;
select * from products;
因此,如果需要,您可以将所有表名都写成大写。
【讨论】:
【参考方案3】:引用你的表名:
st.executeQuery("select * from epcfeschema.\"PRODUCT\"");
【讨论】:
嗯,问题是这实际上是一个概念应用程序的小教授,我需要它在我的实际项目中与 hibernate 和 JPA 一起工作,所以通常我不会直接指定表的名称。 【参考方案4】:Postgres(和任何其他合理的数据库)表名不区分大小写(参见here)。您的问题出在其他地方 - 也许是权限?
【讨论】:
Postgres 不是一个合理的数据库,因为我已经研究了一段时间并且它区分大小写。再次,我可以同时制作一个产品表和一个产品表.... 你是如何创建表的,PRODUCT
或 "PRODUCT"
?
postgre 产品中的原因
嗯,不。 product
与PRODUCT
相同,但与"PRODUCT"
不同。 Postgres 的行为方式与链接文档描述的方式相同。您是否使用psql
进行测试?如果您使用的是第三方工具,它可能会在执行 SQL 之前引用所有标识符。
psql CREATE TABLE "TABLEU"( "TABLE_VAL" varchar(18) NOT NULL, "TABLE_ID" numeric(18, 0) ) -------------- 也请注意,我实际上并不能控制脚本,我所能做的就是运行它们。 ;以上是关于JDBC 将我的 postgres 查询中的表大写的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot jdbc模板在自定义模式下的postgres中找不到表