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 产品中的原因 嗯,不。 productPRODUCT 相同,但与"PRODUCT" 不同。 Postgres 的行为方式与链接文档描述的方式相同。您是否使用psql 进行测试?如果您使用的是第三方工具,它可能会在执行 SQL 之前引用所有标识符。 psql CREATE TABLE "TABLEU"( "TABLE_VAL" varchar(18) NOT NULL, "TABLE_ID" numeric(18, 0) ) -------------- 也请注意,我实际上并不能控制脚本,我所能做的就是运行它们。 ;

以上是关于JDBC 将我的 postgres 查询中的表大写的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JDBC 接收器连接器将表名转换为大写

为啥 PostgreSQL 不喜欢大写的表名?

Spring Boot jdbc模板在自定义模式下的postgres中找不到表

将 Pyspark 数据帧加载到 postgres RDS 中的表中时出错

如何在 Postgres 中删除区分大小写?

Postgres使用JDBC Kafka Connect进行流式传输