springboot entity 插入字段问题. - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Zach369
V2EX    Java

springboot entity 插入字段问题.

  •  
  •   Zach369 2023-02-14 23:30:47 +08:00 2304 次点击
    这是一个创建于 970 天前的主题,其中的信息可能已经有所发展或是发生改变。

    数据库中有张表, 表中假设有 id(主键),name(not null default ""), phone(必填)

    entity:

    public class User implements Serializable { private Long id; /** * 昵称 */ private String name; /** * 手机号 */ private Strig phone; } 

    现在有一个 post 接口, 我使用 User 来接收, 然后直接通过 mybatis 插入, 报错 SQLIntegrityConstraintViolationException: Column 'name' cannot be null; 这个错误意思很明显: 因为 post 接口 name 没有传值, 导致 name 就是 String 对象的 null;

    我现在设置 private String name = ""; 也能解决, 但是我一个表中可能有很多很多字段 都是这样的,要么 not null default ""/0/1 等, 有什么好的解决办法吗?
    框架 springboot 2.7.8 + mybatis

    18 条回复    2023-02-20 15:49:55 +08:00
    atonganan
        1
    atonganan  
       2023-02-15 07:27:00 +08:00
    public class User implements Serializable {
    private Long id;
    /**
    * 昵称
    */
    private String name = "";
    /**
    * 手机号
    */
    private String phone;
    }
    DoctorDeng
        2
    DoctorDeng  
       2023-02-15 08:54:00 +08:00
    api 参数不合法不应该检验一下么
    cslive
        3
    cslive  
       2023-02-15 08:54:55 +08:00
    按道理来说不应该啊,不都是判断是否为空再插入的吗
    freedom0
        4
    freedom0  
       2023-02-15 09:18:12 +08:00
    @NotBlank(message = "name is not null")
    private String name;
    lybcyd
        5
    lybcyd  
       2023-02-15 09:51:55 +08:00
    这个要看你的业务逻辑,如果名字本身就是必填项,那就加一个校验,如果没填名字就强制用户填写。如果是可选,那就默认为空字符串。
    Zach369
        6
    Zach369  
    OP
       2023-02-15 10:02:31 +08:00
    @atonganan 我上面写了, 可以这么弄,直接="", 但是我一个 class 有太多这样的了, 我不想每个都写.


    @DoctorDeng @cslive name 本身就是可选参数, 我数据库设置为 not null default "", api 怎么验证那?如果别人不传, @RequestBody 接收, name 就是 Null

    @lybcyd
    poner09
        7
    ponder09  
       2023-02-15 10:35:45 +08:00
    可选字段数据库为什么要 not null 呢
    xiaohundun
        8
    xiaohundun  
       2023-02-15 11:40:29 +08:00
    你自己实现一个 MessageConverters ,然后 mvc 里面配置好 MessageConverters
    timethinker
        9
    timethinker  
       2023-02-15 13:15:13 +08:00
    如果你的数据库字段设置为 NOT NULL ,默认值仅在你未指定字段值的时候才有用,举个例子,如下的 SQL 可以正常工作,因为没有指定 name ,因此默认值生效了:
    INSERT INTO user (phone) VALUES ('XXX')

    但是假如 SQL 为下面这种,因为 name 字段不允许为空,因此这个插入是不合法的:
    INSERT INTO user(name, phone) VALUES(NULL, 'XXX')

    Mybatis 可以在 XML 中使用 if 来判断某个值是否为空,然后再决定最后构造的 SQL ,比如这种:
    <insert id="insertUser" keyColumn="id" >
    INSERT INTO user
    <trim prefix="(" suffix=")" suffixOverrides=",">
    <if test="name != null">
    name,
    </if>
    <if test="phone != null">
    phone,
    </if>
    </trim>
    <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
    <if test="isDeleted != null">
    #{name},
    </if>
    <if test="paymentId != null">
    #{phone},
    </if>
    </trim>
    </insert>
    timethinker
        10
    timethinker  
       2023-02-15 13:18:54 +08:00
    例子中自行把最后的 isDeleted 和 paymentId 改为 name 和 phone ,我这里复制过来的,这点忘了更改。
    OldCarMan
        11
    OldCarMan  
       2023-02-15 13:59:06 +08:00
    @wangxin3 不给默认值,有时会出现一些使用上的问题,比如:某些函数像 sum,count 之类的有时失效,group by 聚合数据时有时也有问题,另外某些场景索引会失效。所以一般情况下都会给个默认值。当然以上纯属个人看法。
    vagusss
        12
    vagusss  
       2023-02-15 14:12:47 +08:00
    我看你这情况,数据库字段值只设置默认值就好了, 不要设置 not null, 这样插入时如果 name 为 null ,就会填充默认值
    vagusss
        13
    vagusss  
       2023-02-15 14:16:20 +08:00
    我好像说错了, 当我没说.........
    Kontinue
        14
    Kontinue  
       2023-02-15 14:22:18 +08:00
    你这前后矛盾,本来就是可 null 的,数据库还设置 not null 。。。
    JPA 里有个 @DynamicInsert 的注解,如果字段为 null ,就不拼接到 sql ,不知道 mybatis 里有没有类似的
    c6h6benzene
        15
    c6h6benzene  
       2023-02-15 14:27:18 +08:00 via iPhone
    类似 @timethinker 的说法,如果自己写 SQL 的话,你 INSERT 的时候不指定相应字段,它就会自动插入默认值。如果你写了字段,MyBatis 填充 VALUES 时又用的是 null 的话,就会出现你说的问一句。
    ponder09
        16
    ponder09  
       2023-02-15 14:40:19 +08:00
    用 mybatis 的话 只能 xml 中自己写动态 SQL ,另外不建议在实体类中定义默认值(很坑的);如果可以替换用 mybatisplus 的话字段上有个注解 @TableField(insertStrategy = FieldStrategy.NOT_NULL)也可帮到你。
    mosliu
        17
    mosliu  
       2023-02-15 15:30:23 +08:00
    entity 中的 field 赋处置就行了。。
    问题就是看上去不优雅。。
    Aresxue
        18
    Aresxue  
       2023-02-20 15:49:55 +08:00
    数据库里不要用 not null 设个 default ''好了
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2378 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 01:24 PVG 09:24 LAX 18:24 JFK 21:24
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86