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>
相关推荐
行者全栈架构师1 小时前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师5 小时前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_06 小时前
mac(m5)平台编译openjdk
java
倔强的石头_1 天前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
唐青枫1 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261351 天前
Java 打印 Word 文档:从基础打印到高级设置
java
冬奇Lab2 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程