PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como selecionar várias linhas por suas chaves primárias compostas no JOOQ?

Como fazer isso manualmente


Você pode traduzir sua consulta SQL diretamente para jOOQ usando DSL.row() para construir uma expressão de valor de linha e, em seguida:
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")
);

Veja também o jOOQ seção do manual sobre o IN predicado, grau> 1

Usar teclas incorporáveis


Como alternativa, você pode lucrar com a segurança de tipo adicional oferecida pelo novo jOOQ 3.14 <embeddablePrimaryKeys/> recurso, que permite gerar tipos de registro para todas as chaves primárias e suas chaves estrangeiras de referência. Sua consulta seria então:
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();

Isso produz a mesma consulta que a original, mas digita com segurança e você nunca mais esquecerá uma coluna-chave. Não apenas quando você consulta a chave primária, mas também quando a junta! Alterar a chave resultará em um erro de compilação:
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();

Ou uma junção implícita ficaria assim:
ctx.select(OTHER_TEST_TBL.testTbl().fields(), OTHER_TEST_TBL.fields())
   .from(OTHER_TEST_TBL)
   .fetch();