如何告诉 Hibernate 注释 @Column 区分大小写?

Posted

技术标签:

【中文标题】如何告诉 Hibernate 注释 @Column 区分大小写?【英文标题】:How to tell Hibernate annotation @Column to be case-sensitive? 【发布时间】:2014-04-25 16:24:50 【问题描述】:

我正在尝试在带有 Hibernate 的 Sybase 数据库上的名为 ECM(大写)的表中执行简单的 SELECT 查询。我以这种方式注释了我的 DBO:

@Entity
@Table(name="ECM")
public class RelationshipDbo 
    ...

但是,我遇到了“table not found”错误:生成的 SQL 的表名是小写的。我无法更改数据库配置以使其不区分大小写。

我也试过这样引用:

@Table(name="`ECM`")

还有这个:

@Table(name="'ECM'")

结果:在查询中添加了引号,但表名仍然从大写转换为小写。

技术资料:

Hibernate 4.3
JPA 1.2
org.hibernate.dialect.SybaseDialect

你们有什么想法吗?

编辑:也试过这个Hibernate changes @Table(name) to lowercase

然后我的列名和表名被自动引用,但名称仍然小写。

【问题讨论】:

嗨@Deathtiny,你能找到这个问题的解决方案吗,我也面临同样的问题。 【参考方案1】:

试试这个:

@Table(name="`ECM`")?一样使用反引号

这必须从休眠点开始工作。如果不是,那么问题应该出在数据库中(如果我没记错的话)

【讨论】:

已经测试过了,但不成功,如我的帖子中所述。问题是,即使引用,ECM 字母由于某种原因被小写。【参考方案2】:

我想我有你的答案:

基本上,您需要更改 JPA 提供者的命名策略。您如何执行此操作将取决于您如何设置项目。

在我的例子中,我使用 spring boot 数据在我的 application.properties 中设置了一个属性

spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.EJB3NamingStrategy

如果没有您提供更多详细信息,我无法提供有关如何执行此操作的更多细节。

【讨论】:

【参考方案3】:

我的目标有点不同,因为我试图创建大写的表,而 hibernate 以小写创建它们。另外我使用的是 mysql 而不是 Sybase。 但对我来说,引用这样的名字是可行的:

@Entity
@Table(name="\"ECM\"")
public class RelationshipDbo 
    ...

然后表被创建为大写。也许这对查询也有帮助。

【讨论】:

看起来很难看,但确实有效。然而,最好的选择是改变 Hibernate 的命名策略,@see ***.com/a/39194169/956727【参考方案4】:

您的 Sybase 数据库版本是多少? SybaseDialect 在 Hibernate 3.5 中已被弃用,然后从 Hibernate 4.1 开始重构,其中包含一堆匹配不同版本的 Sybase 的子类。您是否尝试过其中一个子类,看看它是否有任何不同?

org.hibernate.dialect.Sybase11Dialect org.hibernate.dialect.SybaseAnywhereDialect org.hibernate.dialect.SybaseASE15Dialect

【讨论】:

谢谢,尝试了三种可能的方言,但生成的 SQL 保持不变:我的表名总是小写.. 奇怪。我通过在现有项目中切换到 SybaseDialect 进行了快速测试(使用 H2 in-mem db),我的 SQL 输出中的情况是正确的。我在配置中看到的主要区别是我使用的是 JPA 2.1。不确定这是否会有所不同。

以上是关于如何告诉 Hibernate 注释 @Column 区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Hibernate 注释标记外键约束?

JPA @Column 注释以创建注释/描述

[ SSH框架 ] Hibernate框架学习之四(JPA)

当 bean 类与一对多注释链接时,使用 hibernate 在 db 上选择查询:

告诉 Hibernate 的 hbm2ddl 为 @Enumerated 注释字段添加 MySQL 枚举列

Hibernate:覆盖实体获取器以添加注释