Как заставить имена столбцов в нижнем регистре с помощью Spring Data JDBC в базе данных H2JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как заставить имена столбцов в нижнем регистре с помощью Spring Data JDBC в базе данных H2

Сообщение Anonymous »

Мы переносим нашу схему базы данных на PostgreSQL (17 на данный момент). При этом мы хотим изменить имена таблиц и столбцов на low_case. Это отлично работает с PostgreSQL. Однако во время части интеграционного тестирования мы выполняем наш код в базе данных H2, находящейся в памяти. И некоторые части нашей цепочки инструментов (Liquibase, Spring Data JDBC, база данных H2) по-прежнему принудительно указывают имена столбцов в верхнем регистре.
Субъект Spring Data JDBC:

Код: Выделить всё

package some.app;

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Table;

@Table(value = "address")
public record Address(
@Id Integer persistenceId,
String name,
String street,
String postCode,
String city,
String countryCode) {}
Миграция Liquibase: Конфигурация источника данных для H2 (выдержка из application.yaml):

Код: Выделить всё

spring:
datasource:
url: jdbc:h2:mem:test;database_to_lower=true;case_insensitive_identifiers=true
driver-class-name: org.h2.Driver
username: sa
password:
Код, работающий с PostgreSQL 17, не работает с базой данных H2 со следующей ошибкой (отформатирован для удобства чтения):

Код: Выделить всё

org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar
[SELECT "address"."CITY" AS "CITY",
"address"."NAME" AS "NAME",
"address"."STREET" AS "STREET",
"address"."POST_CODE" AS "POST_CODE",
"address"."COUNTRY_CODE" AS "COUNTRY_CODE",
"address"."PERSISTENCE_ID" AS "PERSISTENCE_ID"
FROM "address"
WHERE "address"."PERSISTENCE_ID" = ?]
Таким образом, нам удалось убедить «весь стек» сохранять имена таблиц в нижнем регистре. Однако имена столбцов по-прежнему преобразуются в верхний регистр.
Чтобы сузить проблему, я внедрил DataSource в класс интеграционного теста, в котором контекст Spring Data JDBC запущен для H2 (с аннотацией @DataJdbcTest) и запрошен для всех имен таблиц и столбцов, используя

Код: Выделить всё

select * from INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA = 'PUBLIC'
Это возвращает результат, предполагающий, что имена таблиц и столбцов в базе данных H2 действительно имеют нижний регистр. Таким образом, имена столбцов UPPER_CASE, похоже, происходят не из Liquibase, а где-то в стеке Spring.
Единственное обходное решение, которое я нашел до сих пор, — это явно указывать имя каждого отдельного столбца в нижнем регистре:

Код: Выделить всё

package net.contargo.adapter.pws2cola.config;

import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;

@Table(value = "address")
public record Address(
@Id @Column("persistence_id") Integer persistenceId,
@Column("name") String name,
@Column("street") String street,
@Column("post_code") String postCode,
@Column("city") String city,
@Column("country_code") String countryCode) {}
Есть ли способ указать Spring Data JDBC сделать это по умолчанию?


Подробнее здесь: https://stackoverflow.com/questions/798 ... 2-database
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»