SpringDataJPA中的insert方法,有如同MyBatis中的insertSelective之类的写法?

[实际现象]
长期使用MyBatis, 利用Mybatis的工具(Mybatis Generator/ 通用Mapper), 可以有类似 insertSelective(E) 之类的方法.

其实就是映射如下SQL写法( 有很多字段有默认值, insert时只需要部分值就可以了)

CREATE TABLE  `TABLENAME` (
`id`  bigint UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'PRIMARY KEY' ,

name VARCHAR(1000) NOT NULL ,

`deleted`  tinyint UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否已经被删除' ,
`create_time`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '插入时间' ,
`update_time`  datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '被更新时间' ,

PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='TABLENAME';



插入数据(希望spring data 能映射到这个)
INSERT INTO tablename (name) VALUES('NAME1');

但是spring data 在调用 insert(E)时, 需要将E的所有非NULL属性全部赋值(比如这里的 create_time, 但是其实我并不care, 因为数据库已经处理了)

[预期现象 & 我要做什么]

  • 希望spring data , 在insert(E)数据时, 能够只提供部分值.( 具体来说, 就是有mybatis 中的那种insertSelective 方法 )
  • insert时,生成的sql 语言, 只处理我的实体中的 非 null 值, 不要去处理 null 值

[代码]

SQL
如上

Entity
public class Person {
    private Long id;
    private String name;
    
    private Boolean deleted;
    private Date createTime;
    private Date updateTime;
    
}


Repository
public interface IPersonRepository extends JpaRepository<Person>{
}


Service
public class PersonService {
    public void insert() {
        final Person p = new Person();
        p.setName("name1");
        this.personRepository.insert(p);   // 会报错
    }
}

[上下文环境(重要语境)] && [场景]

  • mysql 5.7 服务端
  • spring boot 1.5
  • spring data jpa
  • @Repository

[尝试解决 & 我的推测]

  • google 搜索
加入
@Column(insertable=false)
private Date createTime;

但是, 这显然不是我所要的, 大家可以实际动手试试
阅读 2.8k
评论 2018-10-29 提问
    撰写回答

    登录后参与交流、获取后续更新提醒