确认

  • [X] 我的版本是最新版本, 我的版本号与 version 相同, 并且项目里无依赖冲突
  • [X] 我已经在 issue 中搜索过, 确认问题没有被提出过
  • [X] 我已经修改标题, 将标题中的 描述 替换为遇到的问题

当前程序版本

3.5.7

问题描述

开发环境 jdk17 mysql 8.3.0

<dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-dependencies</artifactId>
              <version>3.3.2</version>
              <type>pom</type>
              <scope>import</scope>
          </dependency>
          <!-- 数据库 -->
          <dependency>
              <groupId>com.baomidou</groupId>
              <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
              <version>3.5.7</version>
          </dependency>

测试查询时自定义TypeHandler 生效,修改时未生效,打印如下异常

自定义TypeHandler

@MappedTypes(value = [List::class])
@MappedJdbcTypes(JdbcType.VARCHAR)
class ListStringTypeHandler : BaseTypeHandler<List<String>>() {

    override fun setNonNullParameter(ps: PreparedStatement, i: Int, parameter: List<String>, jdbcType: JdbcType) {
        ps.setString(i, JSON.toJSONString(parameter))
    }

    override fun getNullableResult(rs: ResultSet, columnName: String): List<String>? {
        return rs.getString(columnName)?.let { JSON.parseArray(it, String::class.java) }
    }

    override fun getNullableResult(rs: ResultSet, columnIndex: Int): List<String>? {
        return rs.getString(columnIndex)?.let { JSON.parseArray(it, String::class.java) }
    }

    override fun getNullableResult(cs: CallableStatement, columnIndex: Int): List<String>? {
        return cs.getString(columnIndex)?.let { JSON.parseArray(it, String::class.java) }
    }
}

库表实体类

@TableName("fw_ru_task", autoResultMap = true)
class RuTask {
    // 任务 ID
    @TableId(type = IdType.AUTO)
    var taskId: Long? = null

    // 候选人集合
    @TableField(typeHandler = ListStringTypeHandler::class, jdbcType = JdbcType.VARCHAR)
    var candidates: List<String> = emptyList()
}

测试类

@Test
    fun test005() {
        KtUpdateChainWrapper(RuTask::class.java).set(RuTask::candidates, mutableListOf("1")).eq(RuTask::taskId,5).update()
    }

详细堆栈日志

org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
### The error may exist in com/go/starter/mapper/RuTaskMapper.java (best guess)
### The error may involve com.go.starter.mapper.RuTaskMapper.update-Inline
### The error occurred while setting parameters
### SQL: UPDATE fw_ru_task  SET candidates=?       WHERE  (task_id = ?)
### Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.

Comment From: miemieYaho

set(RuTask::candidates, mutableListOf("1"),"typehandler=xxx.xxx")

Comment From: gaojunwei

可以了,多谢 KtUpdateChainWrapper(RuTask::class.java) .set(RuTask::candidates, mutableListOf("1"), "javaType=string,jdbcType=ARRAY,typeHandler=com.go.starter.domain.ListStringTypeHandler") .eq(RuTask::taskId,5).update()