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

发布于 2022-09-11 14:49:52 字数 1853 浏览 17 评论 0

[实际现象]
长期使用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;

但是, 这显然不是我所要的, 大家可以实际动手试试

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文