Поисковые данные Spring Boot по дате (отформатировано в ZonedDateTime) - PullRequest
0 голосов
/ 15 ноября 2018

Я хочу получить список форм, представленных на определенную дату. Дата будет передана администратором в поле поиска (в начале она будет String, а в конце - ZonedDateTime).

Я написал метод в репозитории как:

List<AdmissionForm> findByDateContains(ZonedDateTime datePart);

метод формирования ref: https://www.petrikainulainen.net/programming/spring-framework/spring-data-jpa-tutorial-creating-database-queries-from-method-names/

Моя фоновая логика класса обслуживания выглядит так:

@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);
}

Я пытался использовать условия поиска в строке, и он работает нормально, но у меня возникли проблемы только с поиском по дате.

Я получил исключение как:

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 голосов
/ 15 ноября 2018

Использование DateTimeFormat аннотации, которая по умолчанию обрабатывает формат даты и времени ISO yyyy-MM-dd'T'HH:mm:ss.SSSZ:

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

Вам следует дополнительно настроить @DateTimeFormat, если ваша дата не содержитполя секунд, как в вашем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...