带有 DB2 错误 SqlSyntaxErrorException 的 Spring JPA

Posted

技术标签:

【中文标题】带有 DB2 错误 SqlSyntaxErrorException 的 Spring JPA【英文标题】:Spring JPA with DB2 error SqlSyntaxErrorException 【发布时间】:2021-10-12 02:54:35 【问题描述】:

我正在尝试创建一个 Spring Boot 应用程序来从 DB2 视图中读取数据

我的 application.properties 的数据源为:

spring.datasource.url=jdbc:db2://servername:port/dbname
spring.datasource.username=me
spring.datasource.password=mypass
spring.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DB2390Dialect

当我运行我的应用程序时,它会出现以下错误:

com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL 错误:SQLCODE=-551, SQLSTATE=42501, SQLERRMC=me;CREATE TABLE;DSNDB04, DRIVER=4.29.24

根据我的阅读,这个错误意味着用户“我”没有运行“CREATE TABLE”操作的权限。

如果我将 application.properties 中的上述数据源设置替换为使用 H2 数据库,则一切正常。所以,我知道我的 java 类等都工作正常,但我不确定如何解决这个问题并从 DB2 视图读取数据。

顺便说一句,因为我在这里谈论数据库视图,所以我的实体用@Immutable 注释:

@Entity
@Immutable
@Table(name = "CAR_VIEW") 
public class CarEntity implements Serializable 
   ...

如上所述,在 H2 中运行它会创建 CAR_VIEW,我可以在其中使用 CommandLineRunner 预填充一些数据,然后我还可以从 Postman 查询该数据。

但是,我的 DB2 数据库已经有了这个视图和它提供的数据(通过连接几个表来获取视图中所需的数据)。所以对于 DB2 数据库,我不希望 JPA/Hibernate 创建新的CAR_VIEW(因为我使用的是ddl-auto=update,所以不应该这样),所以它应该看到视图已经存在并且我不应该得到这个错误。

【问题讨论】:

【参考方案1】:

事实证明,我需要为我的实体类提供架构,所以一旦我将架构添加到表注释中,问题就已经解决了。

与上述相比,我的实体类现在具有如下注释:

@Entity
@Immutable
@Table(name = "CAR_VIEW", schema = "MY_SCHEMA") 
public class CarEntity implements Serializable 
   ...

【讨论】:

以上是关于带有 DB2 错误 SqlSyntaxErrorException 的 Spring JPA的主要内容,如果未能解决你的问题,请参考以下文章

如何从 DB2 获取描述性错误消息?

当我使用它与db2进行分页时,我的下一页是错误的

DB2 SQL 错误:jpa 分页项阅读器抛出 SQLCODE=-270 异常

使用PK标识列在表中插入期间AS400 DB2重复键错误

带有实例名称的 DB2 JDBC 连接 url

无法使用带有 securityMechanism=13 的 DataGrip 连接到 DB2