Java 在Hibernate中将列名用双引号括起来
我将SpringJPA2.0.9与Hibernate5.3.5结合使用,并通过JDBC访问FileMaker(v16)数据库,使用本文中的官方JDBC驱动程序 问题是,结果SQL的列名以相应的表名为前缀,如: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
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