首页 > 解决方案 > Hibernate列别名生成问题

问题描述

我的客户有一种有趣的 Filemaker 数据库,我尝试将其与 spring boot + jpa + hibernate 一起使用。在大多数情况下,它工作得很好,但是数据库有一些非常糟糕的列名,它们使用坏字符作为别名来破坏 sql...我在数据库中有一个列,其中包含德语变音符号...

    @Entity(name = "com.bic.ts.db.JPAMitarbeiter")
    @Table(name="Mitarbeiter SB")
    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class JPAMitarbeiter {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        @Column(name = "id_Mitarbeiter", nullable = false)
        private long idMitarbeiter;
    
        @Column(name = "web_email")
        private String eMailAdresse;
    
        @Column(name = "name")
        private String name;
    
        @Column(name = "Abkürzungen Name")
        private String kuerzel;
    }

jpa / hibernate 映射使用某种算法在我从 JpaRepository 用于访问表的默认查询中创建别名。

如果我做一个 repo.findAll() 我得到了 hibernate 生成的以下 sql:

select
    jpamitarbe0_."id_mitarbeiter" as id_mitar1_2_,
    jpamitarbe0_."web_email" as web_emai2_2_,
    jpamitarbe0_."abkürzungen name" as abkürzun3_2_,
    jpamitarbe0_."name" as name4_2_ 
from
    "caos mitarbeiter sb" jpamitarbe0_

as 子句“as abkürzun3_2_”中的“ü”会破坏查询...如果我删除该列,一切都会按预期工作...

在调试期间,我遇到了在休眠中定义结果集映射的可能性(请参阅休眠中的 DefaultEntityAliases),但我发现无法通过我的框架堆栈处理此映射......

我考虑过添加自定义方言,但没有找到修改别名的方法。

我尝试使用自定义 StatementInspector 来修改 sql ......也没有工作......

我试图摆弄@ColumnTransformer 和@FieldResults 和@SqlResultSetMapping 但我失败了......

难道没有一种简单的方法来告诉hibernate对特殊字段使用自定义别名吗?

仅在 @Column 注释中具有“别名”属性将是我的首选解决方案,但这不存在...

任何帮助真的很受欢迎:-)

最好的问候斯特凡

标签: javasqlhibernatejpaalias

解决方案


我确实已经在这个主题上花费了几个小时,我决定以一种非常丑陋的方式来做......我在与原始类相同的包中从 hibernate 重新创建 Alias.java 类,并将引号硬编码到别名生成中...... .(我更改了 toAliasString 方法以返回带有引号的每个别名)...

现在一切都按预期工作......我知道这是一个非常糟糕的主意,但只要我不更改我正在使用的休眠版本,它就应该工作......

所以是的,这有效......但是不,它不应该被视为有用的答案......

在休眠中进行简单的开关或设置以允许带引号的别名肯定是一种更好的方法……或者能够将这些东西放入休眠方言中……

但我得继续做其他事情......谢谢你所有的帮助......

对于对该主题感兴趣的任何人:我在休眠论坛中找到了一个旧线程(2016),正是这个问题:https ://hibernate.atlassian.net/browse/HHH-10493

最好的问候斯特凡


推荐阅读