首页 > 解决方案 > 无法提取结果集。Oracle 数据库的问题

问题描述

我有一个与 Oracle 数据库应用程序连接的 Spring Boot。相同版本的应用程序适用于 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

"status":500,"error":"Internal Server Error","trace":"org.springframework.dao.InvalidDataAccessResourceUsageException: 无法提取 ResultSet;SQL [n/a];嵌套异常是 org.hibernate.exception。 SQLGrammarException: 无法提取 ResultSet\r\n\tat org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:281)\r\n\tat org.springframework.orm.jpa.vendor.HibernateJpaDialect。 translateExceptionIfPossible(HibernateJpaDialect.java:255)\r\n\tat org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)\r\n\tat org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible( ChainedPersistenceExceptionTranslator.java:61)\r\n\tat 组织。springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)\r\n\tat org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:154) 在 com.example.pawel.expense.controller .ExpenseController.createExpense(ExpenseController.java:67) ~[classes/:na] ECT...

所以这是我的这个功能的控制器方法:

    @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

这是我的application.properties

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

标签: javaspringoraclespring-boothibernate

解决方案


您应该像这样添加Hibernate Dialect到您的application.properties

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

或者为 Oracle 数据源创建一个Bean。按照本指南了解更多信息 为 Oracle 配置 Spring Boot


推荐阅读