Исключение ClassCastException, вызванное переносом типа данных в необязательный

#java #spring #postgresql #jpa

#java #spring #postgresql #jpa

Вопрос:

Проблема: я получаю следующий журнал ошибок -> java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.time.LocalDateTime

Возможная проблема, вызванная: возвращаемый тип необязательный, что означает, что у jpa возникают трудности с его отображением, поскольку он распознает необязательный, а не фактический тип данных LocalDateTime.

У кого-нибудь были какие-либо мысли о том, как это исправить? я имею в виду, что я мог бы вернуть объект и он отлично работает, но мне просто нужно вернуть одно значение

работает:

 @Query(value = "SELECT * from audit where type='REQUEST_DOC_ONLINE' and user_id=:userId order by timestamp desc limit 1", nativeQuery = true)
Optional<AuditEntity> getLatestRetrievalDocumentDateAndTime(@Param("userId") Long userId);
  

не работает:

 @Query(value = "SELECT * from audit where type='REQUEST_DOC_ONLINE' and user_id=:userId order by timestamp desc limit 1", nativeQuery = true)
Optional<LocalDateTime> getLatestRetrievalDocumentDateAndTime(@Param("userId") Long userId);
  

Комментарии:

1. Не могли бы вы показать нам класс аудита?

2. Если вы хотите посмотреть, какой тип данных метки времени является типом данных, который я пытаюсь вернуть LocalDateTime @Ismail

3. попробуйте заменить LocalDateTime на Date, а затем самостоятельно преобразовать его в LocalDateTime, временная метка не может быть преобразована в LocalDateTime.

4. @Ismail, если он не может, то принимает весь объект в порядке. Кстати, откуда взялась эта информация?

5. Попробуйте выбрать только столбец метки времени. Заменить SELECT * from audit where... на SELECT timestamp from audit where...

Ответ №1:

  1. Вы извлекаете все столбцы и пытаетесь привести его к LocalDateTime . Я бы предпочел предложить вам выбрать только те столбцы, которые имеют LocalDateTime в качестве типа данных.
  2. Я также думаю, что вы, вероятно, используете Timestamp or Instant в качестве типа данных в AuditEntity классе. Если это так, попробуйте использовать тот же класс при извлечении.

Комментарии:

1. Я объяснил выше, что работает, а что нет, это касается вашего первого пункта. И по поводу второго пункта, который вы сделали -> я не использую такой тип и использую LocalDateTime , в любом случае спасибо за усилия

2. В этом случае попробуйте создать POJO для сопоставления требуемых вам столбцов, а затем используйте это в инструкции fetch.

3. Как показано выше, мне нужно только одно значение, которое является отметкой времени

4. измените select * на select timestamp