Spring Data JPA生成动态SQL空值处理

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 (?, ?, ?, ?)  

你可能感兴趣的:(Spring Data JPA生成动态SQL空值处理)