Скриншот ошибки:
При использовании баз данных MyBatis-Plus и PostgreSQL иногда возникает исключение org.postgresql.util.PSQLException с сообщением об ошибке «преобразование в класс java.time.OffsetDateTime из int4 не поддерживается». Это исключение обычно вызвано несоответствием типа поля базы данных и типа атрибута класса сущности. В этой статье будет показано, как решить эту проблему, добавив аннотацию @TableField и указав параметры в классе сущности.
При использовании MyBatis-Plus для подключения к базе данных PostgreSQL, если тип данных поля в базе данных — TIMESTAMP, а тип атрибута соответствующего класса сущности — OffsetDateTime, при запросе или вставке данных может быть выдано исключение:
org.postgresql.util.PSQLException: ERROR: column "create_time" is of type timestamp without time zone but expression is of type integer
Hint: You will need to rewrite or cast the expression.
Position: xx
org.springframework.dao.DataIntegrityViolationException: Error attempting to get column 'id' from result set. Cause: org.postgresql.util.PSQLException: conversion to class java.time.OffsetDateTime from int4 not supported
; conversion to class java.time.OffsetDateTime from int4 not supported; nested exception is org.postgresql.util.PSQLException: conversion to class java.time.OffsetDateTime from int4 not supported] with root cause
org.postgresql.util.PSQLException: conversion to class java.time.OffsetDateTime from int4 not supported
Направление первое: Из-за ошибки преобразования типа при попытке получить столбец «id» из набора результатов базы данных. В частности, тип данных столбца 'id' в базе данных — int4 (целое число), но при сопоставлении с классом сущностей Java используется тип java.time.OffsetDateTime (дата времени), что приводит к сбою преобразования.
Направление второе:
Решением этого исключения является добавление аннотации @TableField к классу сущности и использование параметра jdbcType для явного указания типа данных поля базы данных.
Предположим, у нас есть класс сущности с именем User с полем с именем createTime и типом данных OffsetDateTime. Аннотируйте это поле в классе сущности следующим образом:
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.time.OffsetDateTime;
@TableName("user") // имя таблицы
public class User {
// Остальные атрибуты опущены...
@TableField(value = "create_time", jdbcType = JdbcType.TIMESTAMP)
private OffsetDateTime createTime;
// Другие методы опущены...
}
В приведенном выше коде мы добавили аннотацию @TableField к полю createTime и использовали параметр jdbcType, чтобы указать, что тип данных поля в базе данных — TIMESTAMP.
в использовании MyBatis-Plus соединять PostgreSQL база данных, встречающаяся “conversion to class java.time.OffsetDateTime from int4 not supported” Исключения обычно возникают из-за несоответствия типа данных поля класса сущности и типа данных поля базы данных. Чтобы решить эту проблему, мы можем использовать в классе сущности @TableField Аннотировать и передать jdbcType Параметры указываются явно. данныхполетип данные. Решение, представленное в этой статье, поможет вам устранить эту аномалию и обеспечить бесперебойную работу вашего проекта.
Надеюсь, эта статья поможет вам! Если у вас есть какие-либо вопросы или предложения, пожалуйста, оставьте сообщение в области комментариев, спасибо за чтение!