Spring Boot按日期搜索数据(格式为ZonedDateTime)

时间:2018-11-15 10:43:24

标签: java spring spring-boot spring-filter

我想获取在特定日期提交的表单列表。管理员将在“搜索”框中传递日期(从前端开始是字符串,而在后端是ZonedDateTime)。

我在存储库中将方法编写为:

List<AdmissionForm> findByDateContains(ZonedDateTime datePart);

方法形成参考:https://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-creating-database-queries-from-method-names/

我的Service类的背景逻辑是:

@Transactional(readOnly = true)
public List<AdmissionFormDTO> findByDate(ZonedDateTime datepart){
    return admissionFormRepository.findByDateContains(datepart).stream()
        .map(admissionFormMapper::toDto)
        .collect(Collectors.toList());
}

“我的资源”端点类似于:

@GetMapping("/admissionForms/date")
@Timed
public List<AdmissionFormDTO> findByDate(@RequestParam("date") String date){
    log.debug("REST request to get AdmissionForms by searchTerm :" + date);
    //String to ZonedDateTime method conversion from seperate class
    ZonedDateTime zDate = SupportUtils.convertStringDateToZoneDateTime(date);
    return admissionFormService.findByDate(zDate);
}

我已经尝试过使用String搜索项,并且工作正常,但是在使用Date搜索时只会遇到麻烦。

我遇到了类似的异常

java.lang.IllegalArgumentException: Parameter value [%2018-11-20T00:00Z%] did not match expected type [java.time.ZonedDateTime (n/a)]' and exception = 'Parameter value [%2018-11-20T00:00Z%] did not match expected type [java.time.ZonedDateTime (n/a)]; nested exception is java.lang.IllegalArgumentException: Parameter value [%2018-11-20T00:00Z%] did not match expected type [java.time.ZonedDateTime (n/a)]'

进行一些更正,以便我可以按预期的日期进行搜索。

已编辑: 我将数据类型从ZoneDateTime更改为LocalDate,并相应地解决了以下问题(暂时略过计时):

我的存储库代码:

List<AdmissionForm> findByDate(LocalDate datePart);

我的服务等级:

@Transactional(readOnly = true)
public List<AdmissionFormDTO> findByDate(String datepart){
    LocalDate localDatePart = SupportUtils.convertStringDateToLocalDate(datepart);
    return admissionFormRepository.findByDate(localDatePart).stream()
        .map(admissionFormMapper::toDto)
        .collect(Collectors.toList());
}

我的资源入口点:

@GetMapping("/admissionForms/date")
@Timed
public List<AdmissionFormDTO> findByDate(@RequestParam("date")String date){
    log.debug("REST request to get AdmissionForms by searchTerm :{}",date);
    return admissionFormService.findByDate(date);
}

感谢您的建议,但找不到与ZondDateTime配合使用的方法,因此我们对要求进行了一些更改。希望其他人在这里可以从问题和建议答案中获得帮助。

1 个答案:

答案 0 :(得分:1)

使用DateTimeFormat注释,该注释默认处理ISO yyyy-MM-dd'T'HH:mm:ss.SSSZ日期时间格式:

public List<AdmissionFormDTO> findByDate(
          @RequestParam("date") @DateTimeFormat ZonedDateTime date) {
  return admissionFormService.findByDate(date);
}

如果您的日期不包含示例中的秒数字段,则应进一步自定义@DateTimeFormat