Java 在Hibernate中将列名用双引号括起来

Java 在Hibernate中将列名用双引号括起来,java,hibernate,spring-data-jpa,filemaker,Java,Hibernate,Spring Data Jpa,Filemaker,我将SpringJPA2.0.9与Hibernate5.3.5结合使用,并通过JDBC访问FileMaker(v16)数据库,使用本文中的官方JDBC驱动程序 问题是,结果SQL的列名以相应的表名为前缀,如: select marketingc0_.a__IDPK_MarketingCategory as a__IDPK_1_0_0_, marketingc0_.Active as Active2_0_0_ from MarketingCategories as marketingc0_ wh

我将SpringJPA2.0.9与Hibernate5.3.5结合使用,并通过JDBC访问FileMaker(v16)数据库,使用本文中的官方JDBC驱动程序

问题是,结果SQL的列名以相应的表名为前缀,如:

select 
marketingc0_.a__IDPK_MarketingCategory as a__IDPK_1_0_0_, marketingc0_.Active as Active2_0_0_
from MarketingCategories as marketingc0_
where marketingc0_.a__IDPK_MarketingCategory=1
哪个文件制造商不接受抱怨语法错误:

[08007][27034][FileMaker][FileMaker JDBC]FQL0001/(1:153):有 查询语法中的错误

但是,如果列名用双引号括起来,它会毫无怨言地吞下SQL:

select
    marketingc0_."a__IDPK_MarketingCategory" as a__IDPK_1_0_0_, marketingc0_."Active" as Active2_0_0_
    from MarketingCategories as marketingc0_
    where marketingc0_.a__IDPK_MarketingCategory=1
我提出的解决方案是在实体注释中包含以下引号:

public class MarketingCategory {
    @Id
    @Column(name = "\"a__IDPK_MarketingCategory\"")
    private Integer id;

    @Column(name = "\"a_ID_User\"")
    private Integer userId;

    @Column(name = "\"Active\"")
    private Boolean active;

...
}
看起来不太好


是否可以配置Hibernate,使其自动将所有列名用双引号括起来?

您可以在定义中将名为
Hibernate的属性设置为
true
,并将引用所有标识符。除此之外,还有一个不引用列的选项,但没有只引用列的选项。

您可以使用
hibernate。全局引用的标识符
hibernate。启用关键字“自动引用”
可能会有所帮助<代码>关键字“自动报价”已启用
为保留关键字自动添加报价

但在我的例子中,我使用的是列定义。所以hibernates试图给数据类型添加引号。例如,postgresql中的
“BOOLEAN”
“UUID”
。这就是我修改物理命名策略的原因

hibernate.naming.physical-strategy = com.mypackage.MyCustomPhysicalNamingStrategyImpl
下面是示例命名策略类

公共类MyCustomPhysicalNamingStrategyImpl实现可序列化的PhysicalNamingStrategy{
public static final MyCustomPhysicalNamingStrategyImpl实例=新建MyCustomPhysicalNamingStrategyImpl();
@凌驾
公共标识符toPhysicalCatalogName(最终标识符名称、最终JdbcEnvironment上下文){
返回新标识符(name.getText(),true);
}
@凌驾
公共标识符toPhysicalSchemaName(最终标识符名称、最终jdbc环境上下文){
返回新标识符(name.getText(),true);
}
@凌驾
公共标识符TopPhysicalTableName(最终标识符名称、最终JdbcEnvironment上下文){
返回新标识符(name.getText(),true);
}
@凌驾
公共标识符toPhysicalSequenceName(最终标识符名称、最终JdbcEnvironment上下文){
返回新标识符(name.getText(),true);
}
@凌驾
公共标识符TopPhysicalColumnName(最终标识符名称,最终JdbcEnvironment上下文){
返回新标识符(name.getText(),true);
}
}
Hibernate不会修改列定义,但保持表和列名不变

样本实体:

@数据
@实体
@表(name=“CHAT”)
公共课堂聊天{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
@列(name=“ID”,nullable=false)
私人长id;
@列(name=“UUID”,columnDefinition=“UUID”,nullable=false,长度=16)
私有UUID-UUID;
@列(name=“name”,长度=16)
私有字符串名称;
}
命名将按原样进行:

CHAT
------------
ID
UUID
NAME

更新:Hibernate 5.2有
global\u QUOTED\u IDENTIFIERS\u SKIP\u COLUMN\u DEFINITIONS
属性,这正是我想要的。

提示:对于Spring Boot,它是
Spring.jpa.properties.Hibernate.global\u QUOTED\u IDENTIFIERS