Java 开发使用 MyBatis PostgreSQL 问题:传入的参数为 null,CONCAT 函数无法推断参数的数据类型

java 复制代码
Page<Record> queryAll(String memberId, String memberName);
xml 复制代码
<select id="queryAll" resultMap="recordResultMap">
    SELECT *
    FROM record
    WHERE member_id LIKE CONCAT('%', #{memberId}, '%')
        AND member_name LIKE CONCAT('%', #{memberName}, '%')
    ORDER BY ID DESC
</select>
  • 在 Spring Boot 项目中,使用 MyBatis PostgreSQL,执行上述代码,传入的参数为 null 时,出现如下错误信息

    org.springframework.jdbc.BadSqlGrammarException:

    Error querying database. Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型

    The error may exist in file ...

    The error may involve defaultParameterMap

    The error occurred while setting parameters

    SQL: SELECT count(0) FROM record WHERE member_id LIKE CONCAT('%', ?, '%') AND member_name LIKE CONCAT('%', ?, '%')

    Cause: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型

    ; bad SQL grammar []
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:99)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:70)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:79)
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)

    复制代码
      ...

    Caused by: org.postgresql.util.PSQLException: 错误: 无法确定参数 $1 的数据类型
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2676)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2366)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:356)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:496)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:413)

    复制代码
      ...
问题原因
  • 在 PostgreSQL 中,传入的参数为 null,CONCAT 函数无法推断参数的数据类型
处理策略
  • 使用条件判断动态 SQL
xml 复制代码
<select id="queryAll" resultMap="recordResultMap">
    SELECT *
    FROM record
    WHERE 1=1
    <if test="memberId != null and memberId != ''">
        AND member_id LIKE CONCAT('%', #{memberId}, '%')
    </if>
    <if test="memberName != null and memberName != ''">
        AND member_name LIKE CONCAT('%', #{memberName}, '%')
    </if>
    ORDER BY ID DESC
</select>
相关推荐
徒 花4 分钟前
HCIP学习01 网络及基础协议
学习·hcip
cheems95275 分钟前
[SpringMVC] Spring MVC 留言板开发实战
java·spring·mvc
BioRunYiXue6 分钟前
AlphaGenome:DeepMind 新作,基因组学迎来 Alpha 时刻
java·linux·运维·网络·数据库·人工智能·eclipse
fengci.9 分钟前
php反序列化(复习)(第四章)
android·开发语言·学习·php·android studio
Jasmine_llq9 分钟前
《B3923 [GESP202312 二级] 小杨做题》
开发语言·状态标记算法·顺序输入输出算法·递推迭代算法·循环遍历算法·条件终止算法·累加求和算法
此刻觐神10 分钟前
IMX6ULL开发板学习-04(Linux磁盘管理相关命令)
linux·运维·学习
Fairy要carry11 分钟前
实习07-混合大模型的学习
学习
whatever who cares11 分钟前
android中,全局管理数据/固定数据要不要放一起?
android·java·开发语言
神の愛15 分钟前
Mybatis各个属性
数据库·oracle·mybatis
华清远见IT开放实验室16 分钟前
AI 算法核心知识清单(深度实战版1)
人工智能·python·深度学习·学习·算法·机器学习·ai