如果使用了Mybatis-Plus(后文简称MP),则在实体类上增加注解:@TableName(value = "sys_menu", autoResultMap = true)
,并在对应字段上增加注解:@TableField(typeHandler = JacksonTypeHandler.class)
即可。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.copm.ifm.base.basic.pojo.MenuContentList;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 系统菜单表
*
* @author zzf
* @since 2020-12-14
*/
@Getter
@Setter
@ToString
@TableName(value = "sys_menu", autoResultMap = true)
@ApiModel("系统菜单表")
public class SysMenu {
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("操作权限")
@TableField(typeHandler = JacksonTypeHandler.class)
private MenuContentList operations;
}
上述解决方案只适用于MP提供的基础CRUD方法,当我们自己在.xml文件中自己写SQL时就不适用了,此时我们需要自定义resultMap,并在对应字段的
标签中增加typeHandler
属性。
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"
只用了Mybatis的也是使用这种方式:
json内字段作为查询条件:
LambdaQueryWrapper wrapper = Wrappers.lambdaQuery()
// 按事件类型
.apply(dto.getEventType() != null, "json_data->'$.event_type' = {0}", dto.getEventType());
补充: 【问题一】LocalDateTime 数据映射到json后变成了: "createTime": {"hour": 14, "nano": 0, "year": 2022, "month": "FEBRUARY", "minute": 52, "second": 18, "dayOfWeek": "THURSDAY", "dayOfYear": 55, "chronology": {"id": "ISO", "calendarType": "iso8601"},
解决办法:
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createTime;
【问题二】 泛型擦除:
报错信息如下:java.lang.ClassCastException: java.util.HashMap cannot be cast to xxx:
解决办法:
实体类(entity)
添加内部类OperationList,修改属性类型:List
-> OperationList
// 修改前:
private List operations;
// 修改后
private OperationList operations;
// 解决泛型擦除问题
public static class OperationList extends ArrayList {}
Mapper.xml
添加:javaType="org.example.modules.business.entity.SysMenu$OperationList"
参考:
1. 关于泛型,说明的非常详细的好文:Java 泛型,你了解类型擦除吗?_frank909的博客-CSDN博客_java泛型擦除
2. 关于泛型擦除,以及解决办法说明的很详细:
一个Mybatis异常,引发出来的知识点:泛型类型擦除问题_小哥骑单车的博客-CSDN博客