2015-01-25 13 views
5

Mam następujący tworzenie select-zapytanie:Jak uniknąć cudzysłowie aliasów tabel w jOOQ

final DSLContext create = DSL.using(..., SQLDialect.POSTGRES); 

create 
.select(DSL.field("identifier"), DSL.field("name"), 
     create.selectCount() 
       .from(DSL.table("person")) 
       .where(DSL.field("identifier").eq(DSL.field("personOuter.identifier"))) 
       .asField("count")) 
.from(DSL.table("person").as("personOuter")) 

jOOQ generuje następujące zapytanie:

select 
    identifier, 
    name, 
    (select count(*) 
    from person 
    where identifier = personOuter.identifier) as "count" 
from person as "personOuter" 

Zapytanie powinno być:

select 
    identifier, 
    name, 
    (select count(*) 
    from person 
    where identifier = personOuter.identifier) as "count" 
from person as personOuter 

To ostatnie zapytanie działa idealnie w PostgreSQL. Alias ​​tabeli nie powinien być otoczony cudzysłowami.

Czy to błąd?

(Zauważ, że zapytanie jest całkiem głupi jestem zabawy z jOOQ ocenić.).

Poniższy „hack” działa:

create 
.select(DSL.field("identifier"), DSL.field("name"), 
     create.selectCount() 
       .from(DSL.table("person")) 
       .where(DSL.field("identifier").eq(DSL.field("personOuter.identifier"))) 
       .asField("count")) 
.from("person as personOuter") 

Odpowiedz

8

Domyślnie jOOQ będą zawijać wszystkie identyfikatory w cudzysłowie, aby poprawnie obsługiwać wielkość liter.

Mylącą częścią jest to, dlaczego nie jest to zrobione dla DSL.field(String), ale tylko dla Field.as(String). Powodem tego jest to, że jOOQ ponownie używa typu String dla obu:

  • Plain SQL jak w DSL.field(String), gdzie ciąg wejściowy naprawdę nie reprezentują identyfikator, ale arbitralne SQL wyrażenie
  • Identifiers jak w DSL.name(String), gdzie wejściowy ciąg reprezentuje nazwę/identyfikator. Istnieje również DSL.fieldByName(String), aby utworzyć typy Field złożone z identyfikatorów (schematu)/tabeli/kolumny.

Aby usunąć cudzysłowy ze wszystkich wygenerowanych identyfikatorów, można również zmienić Settings.renderNameStyle na RenderNameStyle.AS_IS.

More information about Settings can be found here.

+0

Dziękuję. Będę musiał przeanalizować twoją odpowiedź. Przyjmę to w najbliższych dniach. –

+0

Dziękuję, twoja opinia była bardzo przydatna. –

+0

@JefJedrison: Bardzo proszę. Jeśli masz jakieś dalsze problemy, po prostu zadaj nowe pytanie w Stack Overflow. Będę w okolicy :) –

Powiązane problemy