当前位置: 首页 > 知识库问答 >
问题:

Spring Batch在H2的SQL语句中创建语法错误

周龙光
2023-03-14

我从Spring Boot进行了升级

spring:
  batch:
    jdbc:
      initialize-schema: "always"

它创建序列,但不创建任何表。查看跟踪,它显示了创建表中的语法错误 SQL:SQL 语句中的语法错误(一个示例):

CREATE TABLE BATCH_JOB_INSTANCE ( JOB_INSTANCE_ID BIGINT IDENTITY[*] NOT NULL PRIMARY KEY , VERSION BIGINT , JOB_NAME VARCHAR(100) NOT NULL, JOB_KEY VARCHAR(32) NOT NULL, CONSTRAINT JOB_INST_UN UNIQUE (JOB_NAME, JOB_KEY) ) 

事实上,检查qith H2控制台或SQl linter它将“IDENTITY[*]”标记为错误,否则它将在H2中工作。

第二次尝试也是失败的。我把

spring:
  batch:
    jdbc:
      initialize-schema: "never"

并将Spring文档 https://docs.spring.io/spring-batch/docs/current/reference/html/schema-appendix.html#exampleDDLScripts 的所有SQL放入schema.sql中。并且正确创建所有表和序列。但是,Spring Boot 的启动失败并出现错误:

Could not obtain sequence value; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Field "BATCH_JOB_SEQ.NEXTVAL" not found
Column "BATCH_JOB_SEQ.NEXTVAL" not found; SQL statement:
select BATCH_JOB_SEQ.nextval from dual [42122-204]

当然,序列没有列“nextval”,因为它是一个序列。甚至Spring Batch for databases中不支持序列的解决方案序列表也没有该列。

数据库已正确配置为H2数据库(未尝试其他数据库)。

为什么Spring Batch每次都会创建错误的SQL语句?任何人都可以指出正确的方向吗?

共有2个答案

怀齐智
2023-03-14

MODE=LEGACY 将使用 Spring boot 2.6.x 解决 H2.x 上的问题(nextval 支持将重新启用)

详见:https://github . com/spring-projects/spring-boot/issues/29034 # issue comment-1002641782

郑星雨
2023-03-14

解决方案是H2版本。我们也将H2升级到了2.0,但是这个版本与Spring Batch 4.3.4不兼容。降级到H2版本1.4.200解决了这个问题。

 类似资料:
  • 我正在尝试创建h2 DB模式。这是我的sql 我得到一个错误 原因:org。h2。jdbc。JdbcSQLSyntaxErrorException:SQL语句“创建扩展[*]如果不存在UUID_OSSP”中的语法错误;预期“或、强制、视图、别名、序列、用户、触发器、角色、模式、常量、域、类型、数据类型、聚合、链接、内存、缓存、本地、全局、临时、表、同义词、主、唯一、哈希、空间、索引”;SQL语句:

  • 我在尝试使用flyway和hibernate为PostgresSql创建表时遇到语法错误的问题。Trip类与其他类没有关系(还没有)。我已经成功地为其他两个类创建了购买和用户,但是这个只是给出了错误。 错误信息: [错误]测试运行:1,失败:0,错误:1,跳过:0,所用时间:3.003秒 SQL状态:42000错误代码:42000消息:SQL语句“CREATE TABLE TRIP(ID BIGI

  • 错误消息: [错误]运行得测试:1,失败:0,错误:1,跳过得:0,运行得时间:3.003s<<<失败!-在org.studentnr.backend.service.userserviceTest[错误]org.studentnr.backend.service.userserviceTest.testCreateUser所用时间:0.004s<<<错误!java.lang.IllegalSta

  • 使用准备好的报表的原因有两个: 通过仅添加来自外部世界的数据作为参数来防止SQL注入。 通过让DB预解析语句一次并通过传递参数多次重用它来提高性能。 但是JDBC中准备好的语句与连接绑定在一起。我们应该使用连接池。这意味着在典型的代码示例中,我必须 从池中获取连接 使用H2附带的简单连接池JdbcConnectionPool时,我认为语句不会被缓存。这是否意味着在使用预先准备好的语句时会对性能产生

  • 如何使用MyBatis发出此语句? 语句应如下所示(和被和替换):

  • 问题内容: 我正在尝试为H2导入一个SQL脚本。该脚本由spring- batch提供,用于存储作业元数据。当我直接在H2控制台中执行此脚本时,没有语法错误,但是我在初始化阶段引用了Hibernate / JPA中要导入的相同脚本,却遇到了以下异常: 这是我要执行的脚本:https : //code.google.com/p/joshlong- examples/source/browse/tru