1. 程式人生 > >關於Java訪問PostgreSQL資料庫遇到的問題處理(大小寫問題和欄位型別問題ERROR: operator does not exist: double precision = charact)

關於Java訪問PostgreSQL資料庫遇到的問題處理(大小寫問題和欄位型別問題ERROR: operator does not exist: double precision = charact)

()最近在寫關於資料錶轉RESTful服務介面的相關功能,在關於PGSQL資料庫的功能方面,遇到如下兩個問題:

1.Java中傳入的SQL(其實在資料庫內直接執行的SQL也一樣),不管大寫還是小寫,最後執行時都會轉為小寫,這樣當資料庫內欄位名為大寫時,就會報 欄位不存在的錯誤,究其原因:在於PostgreSQL對錶名、欄位名都是區分大小寫的。但是PostgreSQL在SQL語句中對大小寫是不敏感的;而在執行SQL時,如果不加雙引號,那麼不管你的SQL中欄位是大寫還是小寫,最後都會預設轉為小寫去執行;因此我們在定義SQL的時候,需要對錶名及欄位名加上雙引號,防止大寫欄位被轉為小寫去執行

為什麼我們加上雙引號,大寫就不會轉為小寫了呢,因為在PGSQL中,預設對SQL語句進行抹去雙引號和大寫轉小寫的其中一個且抹去雙引號優先順序比較高,因此當大寫欄位被加上雙引號,只進行了抹去雙引號的處理而不會再被轉為小寫了;

在Java中定義SQL的時候是這樣的:

 if ("POSTGRE".equalsIgnoreCase(dbType)) {
      column = "\"" + column + "\"";//  雙引號"要加轉義字元
  }

表名也是這樣處理;;

2.另一個問題,如果PGSQL中表的欄位型別為int,float或者date等非varchar型別時,使用Spring前後端的傳遞的值預設為string型別,會報錯:

Cause: org.postgresql.util.PSQLException: ERROR: operator does not exist: numeric = character varying

  建議:No operator matches the given name and argument type(s). You might need to add explicit type
 casts.
因為PLSQL對於欄位型別限制是很嚴格的()MSYQL和Oracle本來就需要傳值為字串,會自動處理),因此對於PGSQL,需要對傳入引數值的資料型別進行處理,兩種方式:

(1) 資料型別轉換後傳入:

int idInt = Integer.valueOf(paramValue);
map.put("id",idInt);

(2)拼接SQL時,加強制轉換語句   示例 ::int   

if (StringUtils.equalsIgnoreCase(dbType, Constant.POSTGRE)) {
      if("DOUBLE".equalsIgnoreCase(dataType)){
         dataType = "FLOAT";
      }
filter = parameterName + " = "  + parameterValue + "::"+dataType;

生成的SQL語句如下所示:

select "table_double"."id" as "id", "table_double"."name" as "name", 
"table_double"."grade" as "grade", "table_double"."birthday" as "birthday" 
from "table_double" 
where ("table_double"."id" <> '1'::BIGINT
 AND "table_double"."grade" <> '2.1'::FLOAT 
AND "table_double"."birthday" <> '2018-10-11'::DATE)

注意:pgsql沒有double型別,需要轉為float型別, 也沒有Long型別-->int