Spring Data JPA默认在生成SQL执行时候会将所有栏位都生成出来,导致有的空值栏位也被赋值,或者你只想更新某几个栏位时候,却把整个对象的属性都更新了,这不符合我们的期望。
Hibernate,JPA注解@DynamicInsert和@DynamicUpdate能实现动态控制空值生成SQL;
@DynamicInsert属性:设置为true,设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false。
比如希望数据库插入日期或时间戳字段时,在对象字段为空的情况下,表字段能自动填写当前的sysdate。
@DynamicUpdate属性:设置为true,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false。
@Data
@Entity
@DynamicInsert
@DynamicUpdate
@Table(name = "t_xxx_inf")
/** 身份校验信息表 **/
public class SlsAppIdtInf {
@Id
@Column(columnDefinition = "char(16) COMMENT'收件编号'")
private String appNbr;
@Column(columnDefinition = "char(10) COMMENT'活体检测结果'")
private String lbResult;
@Column(columnDefinition = "int COMMENT'活体检测重试次数'")
private int lbRepTimes;
@Column(columnDefinition = "timestamp COMMENT'人脸识别时间'", insertable = true, updatable = true)
private Date faceRegTime;
@Column(columnDefinition = "char(19) COMMENT'已绑实名认证银行卡号'")
private String bndCrdNbr;
@Column(columnDefinition = "char(12) COMMENT'已绑实名认证手机号码'")
private String bndMobNbr;
@Column(columnDefinition = "timestamp COMMENT'OCR时间'", insertable = true, updatable = true)
private Date ocrTime;
@Column(columnDefinition = "timestamp COMMENT'姓名身份证确认时间'" , insertable = true, updatable = true)
private Date nameTime;
@Column(columnDefinition = "timestamp COMMENT'实名绑卡时间'" , insertable = true, updatable = true)
其中
insertable = true, updatable = true
设置为true时候为,空值时候会出现下面的SQL:
Hibernate: insert into Cat (cat_name, id) values (?, ?)
默认是false,会全量拼装对象的栏位为SQL:
Hibernate: insert into Cat (create_time, update_time, cat_name, id) values (?, ?, ?, ?)
网友评论