PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie wähle ich mehrere Zeilen anhand ihrer zusammengesetzten Primärschlüssel in JOOQ aus?

Wie man dies manuell macht

Sie können Ihre SQL-Abfrage mit DSL.row() um einen Zeilenwertausdruck zu erstellen, und dann:

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

Siehe auch jOOQ Handbuchabschnitt über IN Prädikat, Grad> 1

Einbettbare Schlüssel verwenden

Alternativ können Sie von der zusätzlichen Typsicherheit profitieren, die das neue jOOQ 3.14 <embeddablePrimaryKeys/> Funktion, mit der Sie Datensatztypen für alle Primärschlüssel und ihre referenzierenden Fremdschlüssel generieren können. Ihre Abfrage würde dann lauten:

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

Dadurch wird die gleiche Abfrage wie bei Ihrer ursprünglichen erstellt, aber die Eingabe erfolgt sicher, und Sie werden nie wieder eine Schlüsselspalte vergessen. Nicht nur beim Abfragen des Primärschlüssels, sondern auch beim Joinen! Das Ändern des Schlüssels führt zu einem Kompilierungsfehler:

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

Oder ein impliziter Join würde so aussehen:

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