mysql 有个字段是json类型
`content_map`json DEFAULT NULL COMMENT'个性化配置内容(LAN3/BGP等)',java 实体属性
/** * 个性化配置内容(JSON存储,包含LAN3/BGP等) */ @TableField(value="content_map", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)private Map<String, Object>contentMap;mybatis-plus 使用wrapper
LambdaQueryWrapper<xxxx>queryWrapper=new LambdaQueryWrapper<>();queryWrapper.eq(xxx::getId,id).eq(xxx::getStoreCode, storeCode);//2. 查询现有记录 xxxxx=xxx.getOne(queryWrapper);但是问题是:content_map 查不到数据,用原生的mybatis 可以正常使用
原因:
MyBatis-Plus 的 JacksonTypeHandler(以及大多数自定义 TypeHandler)默认是按字符串(String)来处理 JSON 的。
但 MySQL 的 JSON 类型在 JDBC 驱动中返回的是 java.sql.SQLJSON 对象(或内部以二进制/特殊格式存储),不是 String!
JDBC 返回 SQLJSON,JacksonTypeHandler 调 getString() 可能失败 → 改用 TEXT
AI和 网上建议加上
@MappedJdbcTypes(JdbcType.OTHER)// MySQL JSON 类型映射为 JdbcType.OTHER @MappedTypes(Map.class)public class MySqlJsonTypeHandler extends BaseTypeHandler<Map<String, Object>>{改xml文件
<resultproperty="contentMap"column="content_map"typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>都没有生效
为什么?
因为wrapper 无法利用 MyBatis-Plus 的 JacksonTypeHandler 自动映射
如果你用 String 类型,即使加了 @TableField(typeHandler = JacksonTypeHandler.class),它也会尝试把 Java 对象序列化成 JSON 字符串,但目标字段是 String,可能导致类型不匹配或异常。
解决方案:
@TableName(value="xxx",autoResultMap=true)让 MP 自动生成带 typeHandler 的 resultMap
@TableName(autoResultMap = true) 是 MyBatis-Plus(MP) 提供的一个非常关键的注解属性,用于自动为实体类生成内联的 resultMap,从而支持如 typeHandler、association、collection 等复杂映射功能。
后面可以试一下这样