我的Java Spring Boot项目中有一个类:

@Entity
@Table(name = "attribute_table")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Attribute {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;
    @Column(name = "name")
    private String name;
    @Column(name = "attribute_type")
    private AttributeType attributeType;
    @Column(name = "value")
    private byte[] value;

    @ManyToOne
    @JoinColumn(name = "asset_category_id")
    private AssetCategory assetCategory;
}

运行后,我得到一个异常:

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "create table test1234 (attribute_type tinyint check (attribute_type between 0 and 3), asset_category_id bigint, id bigint generated by default as identity, name varchar(255), [*]value varbinary(255), primary key (id))"; expected "identifier";

我发现,当表的名称与保留的SQL关键字相同时,就会发生这种类型的错误,但我try 了几个@Table注释的名称,这显然不是原因.

我不知道它是否重要,但在我的属性类中,我有value个字段,它是byte[],因为它的类型取决于AttributeType枚举.此外,AssetCategory中还有BaseClass categoryOf个没有明确定义的类,因为它可以与从BaseClass继承的其他类映射. 以下是我的项目中的其他类:

@Entity
@Table(name = "asset_categories")
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class AssetCategory {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String name;
    @Lob
    @Column(name = "description")
    private String description;

    @OneToMany(mappedBy = "assetCategory")
    private List<Attribute> attributes;

    @OneToOne(mappedBy = "assetCategory")
    private BaseClass categoryOf;

    public void addAttribute(Attribute attribute) {
        attributes.add(attribute);
    }
}
@Getter
@Setter
@Entity
public abstract class BaseClass {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    protected Long id;
    @Column(name = "name")
    protected String name;
    @OneToOne
    @JoinColumn(name = "asset_category", referencedColumnName = "id")
    protected AssetCategory assetCategory;
    @Column(name = "archived")
    protected Boolean archived;

}

public enum AttributeType {
    NUMBER,
    STRING,
    DATE,
    BOOL
}

推荐答案

VALUE是保留字是SQL标准,并且是H2中的关键字,不能将其用作无引号的标识符.

为您的列 Select 一些不同的名称会更好,但是您可以用name = "\"VALUE\""引用这个名称,也可以用spring.jpa.properties.hibernate.globally_quoted_identifiers=true用Hibernate ORM强制引用所有的标识符.

在最坏的情况下,您可以将;NON_KEYWORDS=VALUE添加到JDBC URL(如果您使用h2进行单元测试,您还需要禁用它们的自动配置,否则您的自定义连接URL将被忽略),但此设置并不涵盖所有可能的情况,例如,在ALTER TABLE … ADD … UNIQUE(VALUE)定义中,VALUE仍然具有特殊的含义(对整行的唯一约束).

Java相关问答推荐

PDFBox SmallMap不尊重Map.入口哈希码合同

弹簧靴和龙目岛

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

路径映射未发生

Junit with Mockito for java

XPages-在第二次点击按钮之前延迟

Java Swing:初始化身份验证类后未检测到ATM_Interface键事件

Kotlin内联互操作:强制装箱

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

buildDir:File!&#的getter解决方案是什么?39.被抛弃

如何配置空手道以使用FeignClient或RestTemplate代替ApacheHttpClient

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

如何在字节数组中反转UTF-8编码?

没有Tomcat,IntelliJ如何在本地运行API?

未调用OnBackPressedCallback-Activitiy立即终止

通过/失败的参数化junit测试方法执行数

Java CDI:@Singleton@Startup@Inject无法实现接口

字符串的Gzip压缩在java11和java17中给出了不同的结果

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

放置在变量中的Java成员引用不相等