org.postgresql.util.PSQLException: ОШИБКА: оператор не существует: изменение символов = bytea

#java #postgresql #jpa

Вопрос:

Я пытаюсь сохранить файл Excel и сохранить его в своей базе данных. Я получаю эту ошибку:

 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause

org.postgresql.util.PSQLException: ERROR: operator does not exist: character varying = bytea
Hint: No operator matches the given name and argument types. You might need to add explicit type casts. 
 

Это мой метод отправки сообщений контроллера:

 @PostMapping
public ResponseEntity<DocumentCreateResponse> addDocument(@RequestParam("file") MultipartFile file) throws IOException {
    Path copyLocation = Paths.get(uploadDir, Objects.requireNonNull(file.getOriginalFilename()));
    Files.copy(file.getInputStream(), copyLocation, StandardCopyOption.REPLACE_EXISTING);

    Document savedDocument = documentService.save(copyLocation.toAbsolutePath().toFile());
    if (savedDocument == null){
        return new ResponseEntity<>(new DocumentCreateResponse(null), null, HttpStatus.NOT_ACCEPTABLE);
    }
    return new ResponseEntity<>(new DocumentCreateResponse(savedDocument.getId()), null, HttpStatus.ACCEPTED);
}
 

Это класс документов:

 @Entity
public class DocumentEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name ="document_id")
    private Long id;

    @Column(name ="document_file")
    private File file;


    public DocumentEntity() {
    }

    public DocumentEntity(File file) {
        this.file = file;
    }
}
 

И это мой файл создания схемы (я использую Flyway и PostgreSQL)

 create table if not exists document_entity
(
    document_id bigserial
    constraint document_entity_document_id
    not null primary key,
    document_file varchar not null
);
 

Где я должен добавить изменения, чтобы мои файлы сохранялись правильно и не вызывали эту ошибку? Я читал статьи и видел эту ошибку, но я не вижу, что я должен изменить в своем коде.

 public class DocumentService implements DocumentServicePort {
    private final DocumentRepository documentRepository;

    public DocumentService(DocumentRepository documentRepository) {
        this.documentRepository = documentRepository;
    }

    @Override
    public Document save(File file) {
        Document document = new Document(file);
        if (document.hasValidExtension(document)) {
            documentRepository.saveDocument(document);
            return document;
        }
        return null;
    }
}
 

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

1. пожалуйста, добавьте также свой класс репозитория. в чем заключается реализация documentService.save

2. Я добавляю класс DocumentService в post, documentRepository имеет только один метод сохранения документа(Документ-документ);

3. метод hasValidExtension проверяет , правильно ли расширение, если нет, он не возвращает документ

4. вы используете JPA для сохранения или запроса?

5. Я использую JPA .

Ответ №1:

Вы объявили свой файл как varchar в базе данных, где в вашем приложении вы объявили это поле как Файл.

Вы можете сделать несколько вещей, но для случая, о котором вы упомянули, измените тип столбца в базе данных. Это должно быть «bytea».

запустите это в бд (лучше, если таблица пуста):

 ALTER TABLE document_entity ALTER COLUMN document_file TYPE bytea USING document_file::TEXT::BYTEA;
 

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

1. Это не работает, все равно получается та же ошибка. Я даже удалил базу данных и настроил ее снова, но она не работала

2. да, это так, так что я понятия не имею, что происходит

3. вы проверили, был ли тип столбца обновлен до bytea?

4. используйте @Lob аннотацию к полю файла в классе сущностей и измените тип переменной на byte[]