()最近在写关于数据表转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