PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment sélectionner plusieurs lignes par leurs clés primaires composites dans JOOQ ?

Comment faire cela manuellement

Vous pouvez traduire votre requête SQL directement en jOOQ en utilisant DSL.row() pour construire une expression de valeur de ligne, puis :

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

Voir aussi le jOOQ section du manuel sur le IN prédicat, degré> 1

Utiliser des clés intégrables

Alternativement, vous pouvez profiter de la sécurité de type supplémentaire offerte par le nouveau jOOQ 3.14 <embeddablePrimaryKeys/> fonctionnalité, qui vous permet de générer des types d'enregistrement pour toutes les clés primaires et leurs clés étrangères de référence. Votre requête se lirait alors :

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

Cela produit la même requête que celle d'origine, mais le fait en toute sécurité et vous n'oublierez plus jamais une colonne clé. Non seulement lorsque vous interrogez la clé primaire, mais aussi lorsque vous la rejoignez ! La modification de la clé entraînera une erreur de compilation :

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 une jointure implicite ressemblerait à ceci :

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