sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo seleccionar varias filas por sus claves primarias compuestas en JOOQ?

Cómo hacer esto manualmente

Puede traducir su consulta SQL directamente a jOOQ usando DSL.row() para construir una expresión de valor de fila y luego:

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

Ver también el jOOQ sección del manual sobre el IN predicado, grado> 1

Usar claves integrables

Alternativamente, puede beneficiarse de la seguridad de tipo adicional que ofrece el nuevo jOOQ 3.14 <embeddablePrimaryKeys/> característica, que le permite generar tipos de registro para todas las claves primarias y sus claves externas de referencia. Su consulta sería entonces:

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();

Esto produce la misma consulta que la original, pero escribe de forma segura y nunca más olvidará una columna clave. ¡No solo cuando consulta la clave principal, sino también cuando se une a ella! Cambiar la clave resultará en un error de compilación:

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();

O una unión implícita se vería así:

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