确认
- [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()