账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    SpringDataJPA中的insert方法,有如同MyBatis中的insertSelective之类的写法?
    22
    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;
    
    但是, 这显然不是我所要的, 大家可以实际动手试试
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部