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>
相关推荐
Moshow郑锴1 小时前
sql-pipeline - 基于PostgreSQL的SQL健康检查与发布编排平台
java·sql
weixin_307779134 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
一水鉴天7 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel7 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
海绵宝宝转agent8 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
每天都要写算法(努力版)8 小时前
【行业前沿报告】DAgger:让智能体在自己走到的状态上学习
人工智能·学习·机器学习
Wang's Blog8 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
Elastic 中国社区官方博客9 小时前
将你自己的密钥用于现有 Elastic Cloud 部署
大数据·数据库·elasticsearch·全文检索
2601_962071579 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
红海云9 小时前
Jev:给智能系统做判断的模型
大数据·数据库·人工智能