2015-01-25 10 views
5

Ho la seguente creazione di selezione-query:Come evitare le virgolette attorno alias di tabella in 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 genera la seguente query:

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

La query dovrebbe essere:

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

Quest'ultima query funziona perfettamente con PostgreSQL. L'alias della tabella non deve essere racchiuso tra virgolette.

È un errore?

(Si noti che la query è abbastanza stupida sto giocando intorno con jOOQ da valutare..)

Il seguente "hack" funziona:

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") 

risposta

8

Per impostazione predefinita, jOOQ vi avvolgerà tutti i vostri identificatori tra virgolette per essere in grado di gestire correttamente la distinzione tra maiuscole e minuscole.

La parte confusa è il motivo per cui questo non viene eseguito per DSL.field(String), ma solo per Field.as(String). La ragione di questo è che jOOQ riutilizza il tipo stringa per entrambi:

  • Plain SQL come in DSL.field(String), dove la stringa di input in realtà non rappresenta un identificatore, ma uno SQL arbitrario espressione
  • Identifiers come in DSL.name(String), dove la stringa di input rappresenta un nome/identificatore. C'è anche DSL.fieldByName(String) per creare tipi Field composti da identificatori (schema)/tabella/colonna.

Al fine di rimuovere le citazioni da tutti gli identificatori generati, si può anche cambiare il Settings.renderNameStyle-RenderNameStyle.AS_IS.

More information about Settings can be found here.

+0

Grazie. Dovrò guardare nella tua risposta. Lo accetterò nei prossimi giorni. –

+0

Grazie, il tuo feedback è stato molto utile. –

+0

@JefJedrison: sei il benvenuto. In caso di ulteriori problemi, è sufficiente fare una nuova domanda su Stack Overflow. Saró in giro :) –