jooq generuje błędne query z apostrofami

jooq generuje błędne query z apostrofami
RequiredNickname
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 646
0

Klepie sobie, dla sportu, cruda w domowym zaciszu i postanowiłem zamiast JPA skorzystać z jooq'a w połączeniu z postgresem i flyway'em.
Wszystko zasadniczo działa ok tzn jooq generuje klasy na podstawie migracji flywaya, ma spięcie z postgresem itp.

Mam natomiast problem z prostym insertem.
Podejrzałem sql'kę którą generuje jooq i wygląda ona w ten sposób:

Kopiuj
insert into "BUCKETS" ("BUCKET_ID", "NAME", "CREATED_AT", "DESCRIPTION") values (cast(? as uuid), ?, cast(? as timestamp(6)), ?)

wygląda na to, że problemem są apostrofy "" bo jak zapodałem ręcznie sql'kę w stringu w prawilnej postaci:

Kopiuj
insert into BUCKETS ("bucket_id", "name", "created_at", "description") values ('1631c204-42cf-455b-a4a2-e28e0761e245', 'nazwa2', '2019-01-21T05:47:08.644', 'opis');

to wszystko działa ok więc problem jest w query generowanym przez jooq (analoigiczny błąd co w aplikacji w czasie wykonywania tego inserta dostaje bezpośrednio z postgresa jak chcę to jooq'owe query wykonać).

Myślałem, że to może problem z dialectem jooq'a ale mimo wszystko w propertisach zapodałem:

Kopiuj
spring.jooq.sql-dialect = Postgres
KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5549
3

A jak wyglada kod w JOOQ?

UPDATE postgre domyślnie używa małych liter w nazwach. Normalnie nie jest to problemem i jak napiszesz BUCKETS to jest to konwertowane to małych liter, ale jak napiszesz ”BUCKETS" to nie jest to konwertowane do małych liter
BTW w Oracle jest na odwrót. Taka śmieszna rzecz której nauczyłem się przy zmianie bazy w projekcie XD

RequiredNickname
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 646
0

Bazuję na wygenerowanych przez jooq klasach i kompilator mówi, że jest ok wszystko:

Kopiuj
    var sql = context.insertInto(
                    Tables.BUCKETS,
                    Tables.BUCKETS.BUCKET_ID,
                    Tables.BUCKETS.NAME,
                    Tables.BUCKETS.CREATED_AT,
                    Tables.BUCKETS.DESCRIPTION)
            .values(bucket.getId(), bucket.getName(), bucket.getCreatedAt(), bucket.getDescription().orElse(null))
            .getSQL();

    System.out.println(sql);
    context.execute(sql);

Update:
Już wiem w czym był problem.
Standardowo postgres, jeżeli nie poda się nazwy tabeli/kolumny w apostrofach, mimo, że napisane wielkimi literami w db mają lower case.
Jooq standardowo zapytania słał upper case'em i w apostrofach. Trzeba było nadpisać konfigurację:

Kopiuj
  @Bean
  public DefaultConfigurationCustomizer configurationCustomizer() {
    return c -> c.settings()
            .withRenderQuotedNames(RenderQuotedNames.NEVER)
            .withRenderNameCase(RenderNameCase.LOWER_IF_UNQUOTED);
  }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.