PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come selezionare più righe in base alle loro chiavi primarie composite in JOOQ?

Come farlo manualmente

Puoi tradurre la tua query SQL direttamente in jOOQ utilizzando DSL.row() per costruire un'espressione di valore di riga, quindi:

row(TEST_TBL.ID_PART_1, TEST_TBL.ID_PART_2).in(
  row("id_part_1_1", "id_part_2_1"),
  row("id_part_1_2", "id_part_2_2")
);

Vedi anche jOOQ sezione manuale relativa a IN predicato, grado> 1

Utilizza chiavi incorporabili

In alternativa, puoi beneficiare della sicurezza aggiuntiva del tipo offerta dal nuovo jOOQ 3.14 <embeddablePrimaryKeys/> funzione, che consente di generare tipi di record per tutte le chiavi primarie e le relative chiavi esterne di riferimento. La tua domanda sarebbe quindi:

ctx.select()
   .from(TEST_TBL)
   .where(TEST_TBL.TEST_TBL_PKEY.in(
      new TestTblPkeyRecord("id_part_1_1", "id_part_2_1"),
      new TestTblPkeyRecord("id_part_1_2", "id_part_2_2")
   ))
   .fetch();

Questo produce la stessa query di quella originale, ma digita in modo sicuro e non dimenticherai mai più una colonna chiave. Non solo quando interroghi la chiave primaria, ma anche quando ti unisci ad essa! La modifica della chiave comporterà un errore di compilazione:

ctx.select()
   .from(TEST_TBL)
   .join(OTHER_TEST_TBL)
   .on(TEST_TBL.TEST_TBL_PKEY.eq(OTHER_TEST_TBL.TEST_TBL_PKEY.TEST_TBL_FKEY))
   .fetch();

Oppure un unione implicita sarebbe simile a questo:

ctx.select(OTHER_TEST_TBL.testTbl().fields(), OTHER_TEST_TBL.fields())
   .from(OTHER_TEST_TBL)
   .fetch();