Java PreparedStatement不希望在SQL Query中将小写字符串名称传递给区分大小写的Postgre



我正在使用Java PreparedStatement对象将行插入Postgres数据库表。(我的代码如下:(

...
// define values to insert
LocalDateTime localDateTime = LocalDateTime.now();
int num = 3;            
double frac = 0.8;
//create PreparedStatement
PreparedStatement st = conn.prepareStatement("INSERT INTO TABLE_Final_Records(Datetime, Number_n, Fraction_f)" 
+ "VALUES (?,?,?)" );
// set placeholder ("?") values as Postgres types
st.setObject(1, localDateTime);
st.setInt(2, num);
st.setDouble(3, frac);
// execute statement
st.executeUpdate();
st.close(); 
...

但是,当我执行上述代码时,我收到错误(通过捕获的SQLException的toString(((:

org.postgresql.util.PSQLException: ERROR: relation ">table__final__records"不存在。

其中,上面代码中指定的每个写字符在引发的异常的文本中显示为小写。

如果我手动将数据库表重命名为全部小写,则无需更改代码即可消除错误。但是,它被替换为:

org.postgresql.util.PSQLException: ERROR: 列 "datetime" of 关系"table_final_records"不存在

一个明显的解决方法是手动将 Postgres 数据库中所有表和列名称中的所有大写字符转换为小写,但是我想知道如何对此类语句强制区分大小写,以便 PostgreSQL 数据库表和列名称与大写字符可以正确识别和更新。

谢谢

您可以通过在查询中引用标识符来解决此问题:

PreparedStatement st = conn.prepareStatement(
"INSERT INTO "TABLE_Final_Records"("Datetime", "Number_n", "Fraction_f")" 
+ " VALUES (?,?,?)" 
);

但底线:您遇到的问题表示您的数据库表和列是在标识符周围用双引号创建的。通常,您希望避免在声明标识符时引用它们,因为这会使它们区分大小写 - 正如您正在经历的那样,这使得编写查询变得乏味和冗长。

最新更新