当前位置:   article > 正文

MySQL数据库切换瀚高数据库(PostgreSQL)导致SQL适配问题:BadSqlGrammarException_could not determine data type of parameter $3

could not determine data type of parameter $3

温馨提示:

下面的出现的情况属于层层递进的,如果只解决其中一种情况会接着报下一个情况,如果只想了解解决方案请直接移步至结论

1. 情况一:ERROR: operator does not exist: smallint = character varying

  1. 报错详细描述:

 2. 产生原因:

        在SQL查询中尝试执行了一个不被支持的数据类型比较操作。

3. 解决方案:

        在application.yaml文件中,在url后加&stringtype=unspecified,例如:

  1. spring:
  2. datasource:
  3. driver-class-name: com.highgo.jdbc.Driver
  4. url: jdbc:highgo://localhost:5866/highgo?currentSchema=demo&stringtype=unspecified
  5. username: root
  6. password: root

 2. 情况二:ERROR: could not determine data type of parameter $5

1. 报错详细描述:

 2. 产生原因:

        常常发生在模糊匹配上。在执行参数化查询时,数据库无法识别或推断出传入参数的具体数据类型。

3. 解决方案:

        需要在注入的值后加::数据类型。例如要模糊匹配varchar类型的name:

        原sql语句为:

SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword},'%');

        修改后sql语句为:

SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::text,'%');

        或者可以修改为:

SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::varchar,'%');

 3. 情况三:ERROR: could not determine data type of parameter $1

1. 产生场景:

        在本地运行时,sql可以正常运行。在部署后,测试sql会报出该错误。一般发生在模糊匹配。

2. 产生原因:

        a. 在执行参数化查询时,数据库无法识别参数$1的确切数据类型。

        b. 本地开发环境与生产环境的配置不同。

3. 解决方案

         在模糊匹配后加 ESCAPE '/' ,如:

        原sql语句:

SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::varchar,'%');

        修改后sql语句: 

SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::varchar,'%') ESCAPE '/';

4. 结论:

第一步,修改appliction.yaml。在application.yaml文件中,在url后加&stringtype=unspecified,例如:

  1. spring:
  2. datasource:
  3. driver-class-name: com.highgo.jdbc.Driver
  4. url: jdbc:highgo://localhost:5866/highgo?currentSchema=demo&stringtype=unspecified
  5. username: root
  6. password: root

第二步,修改sql语句。模糊匹配位置 ,将填充的值指定数据类型,并在CONCAT函数后加 ESCAPE '/'。如:

原sql语句:

SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword},'%');

修改后sql语句为: 

SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::varchar,'%') ESCAPE '/';

或:

SELECT * FROM demo WHERE name LIKE CONCAT('%',#{keyword}::text,'%') ESCAPE '/';
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/972456
推荐阅读
相关标签
  

闽ICP备14008679号