#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[]