SpringBoot JPA 创建错误的 JPQL 并抛出 org.hibernate.exception.SQLGrammarException

问题描述 投票:0回答:1

我的实体具有 OneToMany 关系。下面是代码:

实体类:

@Data
@Entity
@Table(name = "TEST_LADDER", schema = "TEST_DBO")
public class LadderEntityTemp implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    @Column(name = "LADDER_SEQUENCE_ID", nullable = false, insertable = true)
    protected UUID ladderSequenceId;
    @Column(name = "LADDER_ID")
    protected String ladderId;
    @Column(name = "LADDER_ACCOUNT_NBR")
    protected String ladderAccountNbr;
    and more.....

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "ladderEntityTemp")
    private List<RungEntityTemp> ladderRungs;
}

@Data
@Entity
@Table(name = "TEST_LADDER_RUNG", schema = "TEST_DBO")
public class RungEntityTemp implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    @Column(name = "LADDER_RUNG_SEQUENCE_ID", nullable = false, insertable = true, table = "")
    private UUID ladderRungSequenceId;
    @Column(name = "LADDER_SEQUENCE_ID")
    protected UUID ladderSequenceId;
    @Column(name = "LADDER_RUNG_NBR")
    protected Integer ladderRungNbr;
    and more.....

    @ManyToOne(fetch = FetchType.LAZY, optional = false)
    private LadderEntityTemp ladderEntityTemp;
}

存储库类:

@Repository
public interface LaddersRepositoryTemp extends JpaRepository<LadderEntityTemp, UUID> {
    @Query(value = "SELECT * from TEST_DBO.TEST_LADDER ld where ld.LADDER_ACCOUNT_NBR = :accountNum", nativeQuery = true)
    List<LadderEntityTemp> tempQuery(String accountNum);
}

数据库配置类:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.temp.repositories",
        entityManagerFactoryRef = "entityManagerFactory",
        transactionManagerRef= "transactionManager")
public class DatabaseConfig {
    private static final String BASE_PACKAGE = "com.temp.model.entities";

    @Primary
    @Bean(name = "tempDatasource")
    @ConfigurationProperties(prefix = "temp.datasource")
    public DataSource tempDataSource()  {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("tempDatasource") DataSource tempDatasource) {
        Map<String,Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto", "none");
        properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle12cDialect");
        properties.put("oracle.net.encryption_client", "REQUIRED");
        properties.put("oracle.net.encryption_types_client", "( AES256 )");
        return builder.dataSource(tempDatasource).packages(BASE_PACKAGE).properties(properties).build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(
            @Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}
jpa 的

pom.xml 代码片段:

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.0.8</version>
  </parent>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-jpa</artifactId>
  </dependency>

打电话时

List<LadderEntityTemp> ladderEntityList = laddersRepository.tempQuery(accountNumber);
我在日志中发现 JPA 尝试执行以下 2 个查询:

自定义查询 - 休眠:从 TEST_DBO.TEST_LADDER ld 中选择 *,其中 ld.LADDER_ACCOUNT_NBR = ?

A JPQL - 休眠:从 TEST_DBO.TEST_LADDER_RUNG l1_0 选择 l1_0.ladderEntityTemp_LADDER_SEQUENCE_ID、l1_0.LADDER_RUNG_SEQUENCE_ID、l1_0.LADDER_RUNG_NBR、l1_0.LADDER_SEQUENCE_ID,其中 l1_0.ladderEntityTemp_LADDER_SEQ UENCE_ID=?

并出现以下错误:

警告 org.hibernate.engine.jdbc.spi.SqlExceptionHelper 133:Local-1:SQL 错误:904,SQLState:42000 错误org.hibernate.engine.jdbc.spi.SqlExceptionHelper 138:Local-1:ORA-00904:“L1_0”。“LADDERENTITYTEMP_LADDER_SEQUENCE_ID”:无效标识符

2024-04-25 12:10:35 错误 com.temp.controller.LadderController 120:Local-1:梯形 API 错误:搜索库存和保存模型梯形请求中出现异常: org.hibernate.exception.SQLGrammarException:执行 SQL 时出现 JDBC 异常 [select l1_0.ladderEntityTemp_LADDER_SEQUENCE_ID,l1_0.LADDER_RUNG_SEQUENCE_ID,l1_0.LADDER_RUNG_NBR,l1_0.LADDER_SEQUENCE_ID from TEST_DBO.FIXED_INCOME_LADDER_RUNG l1_0 其中 l1_0.ladder EntityTemp_LADDER_SEQUENCE_ID=?] 在 org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:64) 在 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:56) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) 在org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:95)

在谷歌搜索此问题后,我尝试了几个选项,通过添加以下属性来至少阻止错误:

spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.DefaultNamingStrategy

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

但没有任何效果。

问题:

  1. 我在代码中做错了什么?
  2. 为什么 JPA JPQL 创建错误的列名“LADDERENTITYTEMP_LADDER_SEQUENCE_ID”?
  3. 我如何停止 JPA 执行第二个自动生成的 JPQL,因为我在执行自定义查询时不需要该数据。
  4. 是JPA版本的问题吗?我正在使用 spring-boot-starter-parent: "3.0.8" ,它似乎依赖于 jakarta.persistence-api: "3.0.1"。
java spring-boot jpa spring-data-jpa jpql
1个回答
0
投票

你错过了 JoinColumn 注释

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "YOUR_FOREIGN_KEY_COLUMN_NAME")
    private LadderEntityTemp ladderEntityTemp;
``
© www.soinside.com 2019 - 2024. All rights reserved.