1. 简单说明
1、声明该字段为 transient
private transient List<SpecParam> params;
2、声明该字段为 static
private static List<SpecParam> params;
3、通过注解@TableField(exist = false)声明
@TableField(exist = false)
private List<SpecParam> params;
以上三种方式可使对象中的属性不被序列化
2. MP 排除表中不存在字段的三种方式
首先来设定一个场景: 有这样一个Java实体类:Book
@Data
@TableName("t_book")
public class Book {
@TableId
private long id;
private String bookName;
private String remarks;
}
在此我们假设数据库中有一张t_book表,有主键id、书名两个字段。在Book类中remarks属性不属于这张表。
这时候加入有一个插入操作,类似于:
Book book = new Book();
book.setId(1)
book.setBookName("《Thinking In Java》");
book.setRemarks("我是图书的备注");
int rows = bookMapper.insert(book);
这时会报错,因为数据表中并不存在remarks字段。会报出字段不存在的异常,这时因为MP帮助我们做了映射。
解决方式一:添加transient关键字
在不是表中字段的属性前加上关键字transient,代表使用该关键字标识的属性,不会参与序列化过程。
如代码:
@Data
@TableName("t_book")
public class Book {
@TableId
private long id;
private String bookName;
private transient String remarks;
}
缺点是不能参与序列化了
解决方式二:声明变量为static类型
代码如下:
@Data
@TableName("t_book")
public class Book {
@TableId
private long id;
private String bookName;
private static String remarks;
public static String getRemarks() {
return remarks;
}
public static oid setRemarks(String remarks) {
Book.remarks = remarks;
}
}
注意
Lombok的@Data注解不会将静态变量生成getter、setter方法。
缺点:所有的Book都将设置成一样的。假如我们的需求是每一个Book对象都需要一份remarks字段,那声明成静态属性是不可以的。
解决方式三:使用MP的注解@TableField(exist = false) 代码如下:
@Data
@TableName("t_book")
public class Book {
@TableId
private long id;
private String bookName;
@TableField(exist = false)
private String remarks;
}
说明: 这个exisit属性默认是true,即MP会为所有字段自动映射。在此设置成false即可。