16

我正在尝试在我的 Employee 实体中关联一个函数列表(可嵌入),而 H2 似乎对它期望一个“标识符”的说法不满意

引起:org.h2.jdbc.JdbcSQLException:SQL 语句中的语法错误“CREATE TABLE EMPLOYEE_FUNCTIONS (EMPLOYEE_EMPLOYEEID VARCHAR(255) NOT NULL, ACTIVE BOOLEAN NOT NULL, DEPARTMENTNUMBER INTEGER NOT NULL, DESCRIPTION VARCHAR(255), ORDER[*] INTEGER非空)"; 预期的“标识符”;

问题是我已经在另一个项目中做到了这一点,但我不明白为什么它不起作用。

雇员.java

@Entity
public class Employee extends AbstractScheduleEntity<EmployeeSchedule> {
    public static final String ACOMBA_UNIQUE_FIELD = "acombaUnique";

    @Id
    @GenericGenerator(name = "sequence_id", strategy = 
    "ca.tecsar.core.sql.ServerSequenceGenerator")
    @GeneratedValue(generator = "sequence_id")
    @Column(name = "EmployeeID", unique = true, nullable = false)
    private String employeeID;
    @ElementCollection
    private List<Function> functions;

    //getter and setter
}

函数.java

@Embeddable
public class Function implements Serializable {
    private int order;
    private boolean active;
    private String description;
    private int departmentNumber;

    //getter and setter
}

我删除了 Employee 中一些不必要的属性。什么可能导致此错误?是因为我的员工中有一个字符串作为标识符吗?如果是这样,我如何告诉 Hibernate 添加 Employee_EmployeeID 作为标识符?谢谢

4

10 回答 10

56

原来我是愚蠢的,并命名了一个列“订单”。想知道为什么 H2 不开心 :upside_down:

将变量名称更改为其他名称,它起作用了!

于 2017-10-13T20:34:07.650 回答
7

我在命名字段时遇到了同样的问题:private String toand private String from,更改为 ex。dayTo , dayFrom ,它的工作。

于 2019-04-25T10:59:25.190 回答
3

与 Order 作为实体有同样的问题。将表名更改为“orderz”并继续。

于 2020-08-12T09:04:30.480 回答
2

我在使用 Spring 和 H2 数据库进行测试时遇到了同样的问题,我的实体具有字段名称"interval",我重命名为"inter"并解决了问题。

因此,这些错误是由于实体中的 sql 保留名称而发生的。

于 2019-06-10T17:26:47.257 回答
1

我也有一个实体字段的问题,row因为它也是一个关键字

我指定了一个列名 ( "SEAT_ROW") 来绕过它。

@Entity
data class Seat (
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    val id :            Long,
    @Column(name="SEAT_ROW")
    val row :           Char,
    val num :           Int,
    val price :         BigDecimal,
    val description :   String
) {
    override fun toString(): String = "Seat $row-$num $$price ($description)"
}

H2 兼容性和关键字表

于 2021-02-21T03:42:13.543 回答
1

由于我的实体中有一个名为“interval”的字段,我遇到了类似的问题。这篇文章的答案帮助我确定了根本原因,但是更改字段名称对我来说不是解决方案,因为“间隔”对我的班级来说是完美的。

我使用的解决方案是使用休眠注释重命名表列。

 @Column(name = "FREQUENCY_INTERVAL")
 private int interval;

这有助于我在映射到数据库可接受的列名时将变量名保持为“间隔”。

于 2021-01-24T06:12:41.477 回答
0

尝试把 ; 之前的“和测试?

于 2017-10-13T20:20:31.760 回答
0

在我的情况下,问题原因是插入语句问题中的语法不正确:

insert into 'table name missing' (column names...) values(values...);

添加表名后

使固定:

insert into 'table name specified' (column names...) values(values...);

有时很难发现微不足道的错误:)

于 2020-11-10T16:38:26.527 回答
0

我在 h2 中使用 order 作为表名。更改为 _order 之类的东西,我明白了!

正如您在此处看到的,order 是 h2 的保留字。

于 2021-05-06T18:58:27.933 回答
-1

我遇到了同样的问题,但我的却少了一个分号。

于 2020-11-10T16:53:25.733 回答