Оберните имена столбцов в двойные кавычки в Hibernate - PullRequest
0 голосов
/ 14 сентября 2018

Я использую Spring JPA 2.0.9 с Hibernate 5.3.5 и на этом диалекте для доступа к базе данных FileMaker (v16) через JDBC с использованием официального драйвера 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

который FileMaker не принимает, жалуясь на неправильный синтаксис:

[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 так, чтобы он автоматически упаковывал все имена столбцов в двойные кавычки?

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Вы можете использовать hibernate.globally_quoted_identifiers или hibernate.keyword_auto_quoting_enabled.keyword_auto_quoting_enabled автоматически добавляет кавычки для зарезервированных ключевых слов.

но в моем случае я использовал определения столбцов.Таким образом, hibernates пытался добавить цитаты к типам данных.Например, "BOOLEAN" или "UUID" в postgresql.Вот почему я изменил физическую стратегию именования.

hibernate.naming.physical-strategy = com.mypackage.MyCustomPhysicalNamingStrategyImpl

здесь приведен пример класса стратегии именования.

public class WentsyPhysicalNamingStrategyImpl implements PhysicalNamingStrategy, Serializable {

    public static final WentsyPhysicalNamingStrategyImpl INSTANCE = new WentsyPhysicalNamingStrategyImpl();

    @Override
    public Identifier toPhysicalCatalogName(final Identifier name, final JdbcEnvironment context) {

        return new Identifier(name.getText(), true);
    }

    @Override
    public Identifier toPhysicalSchemaName(final Identifier name, final JdbcEnvironment context) {

        return new Identifier(name.getText(), true);
    }

    @Override
    public Identifier toPhysicalTableName(final Identifier name, final JdbcEnvironment context) {

        return new Identifier(name.getText(), true);
    }

    @Override
    public Identifier toPhysicalSequenceName(final Identifier name, final JdbcEnvironment context) {

        return new Identifier(name.getText(), true);
    }

    @Override
    public Identifier toPhysicalColumnName(final Identifier name, final JdbcEnvironment context) {

        return new Identifier(name.getText(), true);
    }
}

Hibernate не будет изменять определения столбцов, но оставит имена таблиц и столбцов какis.

Пример объекта:

@Data
@Entity
@Table(name = "CHAT")
public class Chat {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false)
    private long id;

    @Column(name = "UUID", columnDefinition = "UUID", nullable = false, length = 16)
    private UUID uuid;

    @Column(name = "NAME", length = 16)
    private String name;
}

Имена будут такими, как есть:

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

Обновление: Hibernate 5.2 имеет свойство GLOBALLY_QUOTED_IDENTIFIERS_SKIP_COLUMN_DEFINITIONS, которое является именно тем, что я хочу.

0 голосов
/ 14 сентября 2018

Вы можете установить свойство с именем hibernate.globally_quoted_identifiers в true в ваших определениях, и оно будет заключать в кавычки все идентификаторы.В дополнение к этому есть опция не заключать в кавычки столбцы, но нет опции только заключать в кавычки столбцы.

...