"limit" Hibernate JPA H2 专栏问题
"limit" column in Hibernate JPA H2 problem
我有一个小型的 SpringBoot JPA REST 服务。
我在开发环境中使用 H2。
我正在使用 ddl-auto: update
对分层实体使用单一 table 策略。
实际代码模拟如下
@Data
@Entity
@NoArgsConstructor
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE")
public abstract class SuperEntity {
@Id
@GeneratedValue
Long id;
private String property1;
private String property2;
.............
...............
@ManyToOne
private SomeOtherEntity b;
}
有很多子实体,但是其中一个实体是这样的
@Data
@NoArgsConstructor
@Entity
@DiscriminatorValue("child1")
public class Child1 extends SuperEntity {
@Enumerated(EnumType.STRING)
private CType cType;
private BigDecimal limit;
private BigDecimal x;
private BigDecimal y;
private int z;
.............
...............
}
但是在 DDL 执行期间应用程序启动时,出现以下异常。
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement
CREATE TABLE SUPER_ENTITY (
.............
...............
LIMIT[*] DECIMAL(19,2),
.............
...............
) "; expected "identifier"; SQL statement:
我只提到了 LIMIT 列,因为这是 H2 错误日志 提到 * 的地方。
如果我只是将 Child1 class 中的字段名称从 limit 更改为 creditLimit,一切正常。
列名限制有什么问题?
正如 Alan Hey 提到的,'limit' 是保留关键字。所以你需要像这样转义它:
@Column(name = "`limit`")
还有几种方法。参见 https://vladmihalcea.com/escape-sql-reserved-keywords-jpa-hibernate/
我有一个小型的 SpringBoot JPA REST 服务。
我在开发环境中使用 H2。
我正在使用 ddl-auto: update
对分层实体使用单一 table 策略。
实际代码模拟如下
@Data
@Entity
@NoArgsConstructor
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "TYPE")
public abstract class SuperEntity {
@Id
@GeneratedValue
Long id;
private String property1;
private String property2;
.............
...............
@ManyToOne
private SomeOtherEntity b;
}
有很多子实体,但是其中一个实体是这样的
@Data
@NoArgsConstructor
@Entity
@DiscriminatorValue("child1")
public class Child1 extends SuperEntity {
@Enumerated(EnumType.STRING)
private CType cType;
private BigDecimal limit;
private BigDecimal x;
private BigDecimal y;
private int z;
.............
...............
}
但是在 DDL 执行期间应用程序启动时,出现以下异常。
Caused by: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement
CREATE TABLE SUPER_ENTITY (
.............
...............
LIMIT[*] DECIMAL(19,2),
.............
...............
) "; expected "identifier"; SQL statement:
我只提到了 LIMIT 列,因为这是 H2 错误日志 提到 * 的地方。 如果我只是将 Child1 class 中的字段名称从 limit 更改为 creditLimit,一切正常。
列名限制有什么问题?
正如 Alan Hey 提到的,'limit' 是保留关键字。所以你需要像这样转义它:
@Column(name = "`limit`")
还有几种方法。参见 https://vladmihalcea.com/escape-sql-reserved-keywords-jpa-hibernate/