springboot在添加时出现重复的列名

问题出现(对比示例)

资产类型表数据类型
在这里插入图片描述
对应接受的实体类

package com.njry.modules.system.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.njry.base.BaseEntity;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
import java.io.Serializable;
import java.util.Date;
import java.util.List;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

/**
* @description /
* @author WJ
* @date 2024-04-19
**/
@Data
@TableName("T_ATOM_BUSI_CATEGORY")
public class TAtomBusiCategory  extends BaseEntity implements Serializable {

    @NotNull(groups = BaseEntity.Update.class)
    @TableId(value="category_id", type = IdType.INPUT)
    @ApiModelProperty(value = "ID", hidden = true)
    private Long id;

    @ApiModelProperty(value = "业务类别ID")
    private Long categoryId;

    @NotEmpty(message = "业务类别名称不能为空")
    @Length(min = 1 , max = 40 , message = "名字字节长度1~40")
    @ApiModelProperty(value = "业务类别名称")
    private String categoryName;

    @ApiModelProperty(value = "上级ID")
    private Long superiorId;

    @ApiModelProperty(value = "层级")
    private Integer categoryLev;

    @ApiModelProperty(value = "排序")
    private Integer orderBy;

    @TableField(exist = false)
    private List<TAtomBusiCategory> children;

    @ApiModelProperty(value = "子业务分类数目", hidden = true)
    private Integer subCount = 0;

    @ApiModelProperty(value = "创建人ID")
    private String createId;

    @ApiModelProperty(value = "创建时间")
    private Date createDate;

    @Length(min = 1 , max = 10 , message = "业务类别英文名称长度1~10")
    @ApiModelProperty(value = "业务类别英文名称")
    private String categoryNameEn;

    public void copy(TAtomBusiCategory source){
        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
    }

    public Boolean getHasChildren() {
        return subCount > 0;
    }

    public Boolean getLeaf() {
        return subCount <= 0;
    }

    public String getLabel() {
        return categoryName;
    }
}

前段入参是字符串类型

在这里插入图片描述
实体类接受自动转成null(这里看总结)

在这里插入图片描述
看看最终执行的sql

在这里插入图片描述

上面是类型不一致可以正确插入,下面看看类型一直导致插入错误

任务管理表数据类型
在这里插入图片描述
对应接受的实体类

package com.njry.modules.system.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.njry.base.WorkTypeBaseEntity;
import lombok.Data;
import cn.hutool.core.bean.BeanUtil;
import io.swagger.annotations.ApiModelProperty;
import cn.hutool.core.bean.copier.CopyOptions;
import java.io.Serializable;
import java.util.Date;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
* @description /
* @author wj
* @date 2024-04-25
**/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("NJRY_TASK_INFO")
public class NjryTaskInfo extends WorkTypeBaseEntity implements Serializable {

    @NotNull(groups = WorkTypeBaseEntity.Update.class)
    @TableId(value="task_id", type = IdType.INPUT)
    @ApiModelProperty(value = "ID", hidden = true)
    private Long id;

    @ApiModelProperty(value = "任务编号")
    private String taskId;

    @NotBlank
    @ApiModelProperty(value = "任务名称")
    private String taskName;

    @NotNull
    @ApiModelProperty(value = "任务类型   1:日  2:月  3:实时")
    private Integer taskType;

    @NotBlank
    @ApiModelProperty(value = "存储过程名称")
    private String procName;

    @NotNull
    @ApiModelProperty(value = "开始检测时间")
    private Integer startTime;

    @ApiModelProperty(value = "是否有效")
    private Integer isValid;

    @ApiModelProperty(value = "手机号码")
    private String cellphone;

    @NotNull
    @ApiModelProperty(value = "结束日期")
    private Date endDate;

    @NotNull
    @ApiModelProperty(value = "开始日期")
    private Date startDate;

    @ApiModelProperty(value = "是否发送成功短信")
    private Integer isSucMes;

    public void copy(NjryTaskInfo source){
        BeanUtil.copyProperties(source,this, CopyOptions.create().setIgnoreNullValue(true));
    }
}

前端入参
在这里插入图片描述
这里实体类接受没有自动转成null
在这里插入图片描述
最终报错

在这里插入图片描述

解决办法(insert把前端的空字符串变成null)

在control层直接改变

 @PostMapping
    @Log("新增任务管理")
    @ApiOperation("新增任务管理")
    @PreAuthorize("@el.check('njryTaskInfo:add')")
    public ResponseEntity<Object> createNjryTaskInfo(@Validated @RequestBody NjryTaskInfo resources){
        if (resources.getId() != null) {
            throw new BadRequestException("A new "+ ENTITY_NAME +" cannot already have an ID");
        }
//        原来的id 都是NUMBER类型,前段默认传孔字符串,类型不一致会转成null
//        但是njry_task_info这个表的id 用VARCHAR2(32)
        if(resources.getTaskId().equals("")){
            resources.setTaskId(null);
        }
        njryTaskInfoService.create(resources);
        return new ResponseEntity<>(HttpStatus.CREATED);
    }

总结
不知道springboot每次注解在哪执行long和string相互转换的
在这里插入图片描述

gtp给的答案:

在 Spring Boot 中,当你使用 @RequestBody 注解将请求体中的 JSON 数据绑定到实体类时,会根据实体类中字段的类型来进行转换。在默认情况下,Spring Boot 会尽可能地进行类型转换,并尝试将请求体中的空字符串转换为对应字段的类型。但是,有时候这种转换的行为会受到一些配置或注解的影响,导致一些字段的值转换为 null

以下是可能导致某些字段值为 null 的一些常见原因:

  1. 数据绑定失败: 如果请求体中的 JSON 数据与实体类的字段类型不匹配,或者无法进行正确的转换,Spring Boot 可能会将这些字段的值设置为 null。这可能是因为 JSON 数据中的空字符串无法正确转换为实体类中的某些类型,比如 IntegerLong 等。

  2. 注解影响: 在实体类中使用了一些注解,比如 @JsonDeserialize@JsonFormat 等,它们可能会影响请求体到实体类字段的转换行为。特别是一些日期时间格式的注解,可能会导致空字符串无法正确转换为日期时间类型,从而被转换为 null

  3. 全局配置: Spring Boot 有一些全局配置项,比如 spring.mvc.convert.empty-string-as-null=true,它可以影响空字符串的转换行为。如果该配置项设置为 true,则空字符串可能会被转换为 null

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值