【问题标题】:java.time.format.DateTimeParseException: Text '03/03/2020,03/03/2020' could not be parsed, unparsed text found at index 10java.time.format.DateTimeParseException:无法解析文本“03/03/2020,03/03/2020”,在索引 10 处找到未解析的文本
【发布时间】:2020-08-10 17:19:36
【问题描述】:

我有一个包含“否”和“日期”的表格。它将是动态形式。在 Spring Boot JPA 中进行批量更新时,我得到了“java.time.format.DateTimeParseException: Text '03/03/2020,03/03/2020' could not be parse, unparsed text found at index 10”异常

@RequestMapping(value="/abcpage", produces = { MediaType.APPLICATION_JSON_VALUE })
public String savePurchaseEntries(@ModelAttribute ABC abc,HttpSession session)
{

    System.out.println(abc);
    DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
    LocalDate today = LocalDate.parse(abc.getDate(),dateTimeFormatter);
    abc.setLoclaDate(today);
    return "redirect:/home";
}

这里 ABC 是实体类,我可以获取 dd/mm/yyyy 格式的日期值并转换为 localdate 并设置到实体中。

ABC[NO=101,102,date=03/03/2020,03/03/2020]

对于一个条目,它工作正常,但在批处理时它会抛出异常。

@Entity
class ABC{ 
@column(name="NO") 
private String NO;
@Transient
private String date;
@Column(name="invdate")
private LocalDate loclaDate;
//getters & setters//tostring
}

【问题讨论】:

    标签: java spring-boot spring-data-jpa


    【解决方案1】:

    如果我正确理解了您的输入,我认为您的代码存在问题,即您在 LocalDate.parse(abc.getDate(),dateTimeFormatter) 中传递了逗号 (,) 分隔的日期字符串。

    您需要每次将单个日期传递给 parse() 方法,因为它尝试使用日期格式化程序格式格式化提供的字符串输入,因此当它在“03/03 的输入中遇到逗号(,) 时会发生错误/2020,03/03/2020”。

    请参考official documentation for same.

    以下是您可以尝试的:

    String[] inputDates = abc.getDate().split[","];
    for (String date : inputDates) {
     // you can now use LocalDate.parse(abc.getDate(),dateTimeFormatter) here
     // write your logic here.
    }
    

    我希望这可以帮助您解决疑问,如果不能让我知道您的确切问题,我会尽力帮助您。

    EDIT 1用于插入数据

    下面是插入数据的一种方式,

    创建一个表,该表将存储具有 3 列的日期 - id(P.K.)、abc_id(ABC 表的 F.K. ref.)、日期(在此处存储单个日期)。 现在假设上表的名称是 abc_date_map,然后在您的 ABC 实体中将此实体引用为 OneToMany。如下所示,

    @Entity
    class ABC { 
    
     @Column(name="NO") 
     private String NO;
    
     @Transient
     private String date;
    
     @Column(name="abc_date_map_id")
     private List<AbcDateMap> abcDateMapEntityList;
    
     //getters & setters//tostring
    
    }
    

    你的 AbcDateMap 实体会像

    @Entity
    public class AbcDateMap{
    
     @Column(name="abc_id")
     private Integer abcId;
    
     @Column(name="date")
     private LocalDate localDate;
    
     // getters setters
     
    }
    

    你的实体插入逻辑将是这样的:

    public Long insert(ABC abc) {
    
     abc.setNo(/*something*/);
     
     List<AbcDateMap> l = new ArrayList<>();
     
     AbcDateMap abcDate = new AbcDateMap();
     for (String date : abc.getDate().split(",")) {
      abcDate.setLocalDate(/*parse date here and store*/);
      abcDate.setAbcId(abc.getId());
     }
     abc.setAbcDateMapEntityList(l);
     repo.save(abc);
    
    }
    

    现在上面不是确切的代码,您必须对其进行润色,可能有语法/语义错误。您还需要根据您的要求进行更改。

    【讨论】:

    • 谢谢@prashantdoshi28:) 这个问题已经解决,但在数据库中它存储在一个条目中示例:101,102 03-03-2020 我需要单独的条目。没有发生批量插入。
    • @V.Monisha 好的,所以问题是批量插入没有发生?
    • 是的@prashantdoshi28
    • @V.Monisha 好的,如果我理解错了,请纠正我。您必须在“invdate”列中有多个日期的数据库中存储 ABC 类型的实体?
    • 我必须一次性插入批量数据,而不仅仅是 invdate。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 2019-07-10
    • 1970-01-01
    • 2020-02-16
    • 2021-06-01
    • 2016-10-02
    • 2017-12-09
    相关资源
    最近更新 更多