Не удалось извлечь набор результатов. Проблема с базой данных Oracle

#java #spring #oracle #spring-boot #hibernate

Вопрос:

У меня есть весенняя загрузка, связанная с приложением базы данных Oracle. Та же версия приложения отлично работает с MySQL, но когда я пытаюсь выполнить некоторые запросы к базе данных Oracle, она выдает ошибку:

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

«статус»:500,»ошибка»:»Внутренняя ошибка сервера»,»трассировка»:»org.springframework.dao.InvalidDataAccessResourceUsageException: не удалось извлечь набор результатов; SQL [n/a]; вложенным исключением является org.hibernate.исключение.Исключение SQLGrammarException: не удалось извлечь набор результатовrntat org.springframework.orm.jpa.vendor.Исключение HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)rntat org.springframework.orm.jpa.поставщик.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)rntat организация.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)rntat org.springframework.dao.поддержка.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)rntat org.springframework.dao.поддержка.Наборы данных.Перевести, если это необходимо(DataAccessUtils.java:242)rntat org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:154) по адресу com.пример.павел.расходы.контролер.ExpenseController.createExpense(ExpenseController.java:67) ~[классы/:na] И т. Д…

Итак, вот мой метод контроллера для этой функции:

     @PostMapping("/expense")
    ResponseEntity<Expense> createExpense(@Valid @RequestBody Expense expense) throws URISyntaxException {

        Expense result = expenseRepository.save(expense);
        return ResponseEntity.created(new URI("/api/expense/"   result.getId())).body(result);
    }
 

И моя модель расходов

 @NoArgsConstructor
@Data
@Table(name="expense")
@Entity
public class Expense {

    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;

    private Instant date; 

    private double amount;
    
    private String description;

    @ManyToOne
    private Category category;

    @ManyToOne
    private User user;

// Getters and setters
 

Вот мое приложение.свойства

 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle12cDialect
spring.jpa.properties.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.show-sql=true

spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.datasource.username=system
spring.datasource.password=root
spring.datasource.initialization-mode=always
spring.datasource.validationQuery=SELECT 1

logging.level.org.hibernate.SQL=DEBUG
spring.server.compression.enabled=true

spring.jpa.database-platform=org.hibernate.dialect.Oracle12cDialect

spring.jpa.properties.hibernate.format_sql=true
 

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

1. Примечание — не используйте system в качестве пользователя подключения, создайте своего собственного пользователя подключения к приложению…

2. SELECT 1 не является допустимым запросом для использования Oracle select * from dual

Ответ №1:

Вы должны добавить Hibernate Dialect в свое приложение.свойства, такие как

 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect 

Или создайте компонент для источника данных Oracle. Следуйте этому руководству для получения дополнительной информации
о настройке Spring Boot для Oracle