【问题标题】:How to select multiple rows by their composite primary keys in JOOQ?如何通过 JOOQ 中的复合主键选择多行?
【发布时间】:2020-06-29 00:55:20
【问题描述】:

我有一个包含复合主键的表。我想用一组主键查找行。

我的桌子是:

create table test_tbl
(
    id_part_1 varchar(36) not null,
    id_part_2 varchar(36) not null,
    some_data text not null,
    constraint test_tbl_pkey
        primary key (id_part_1, id_part_2)
);

我的SQL 查询是:

SELECT * FROM test_tbl
    WHERE (id_part_1, id_part_2) IN (('id_part_1_1', 'id_part_2_1'), ('id_part_1_2', 'id_part_2_2'));

那么,如何在 JOOQ 的帮助下实现这个查询呢?我不生成 JOOQ Dao,我只有 JOOQ 表。

【问题讨论】:

    标签: java postgresql select jooq composite-primary-key


    【解决方案1】:

    如何手动操作

    您可以使用DSL.row() 将您的SQL 查询直接转换为jOOQ 以构造一个行值表达式,然后:

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

    另请参阅jOOQ manual section about the IN predicate, degree > 1

    使用可嵌入键

    或者,您可以从新的 jOOQ 3.14 <embeddablePrimaryKeys/> 功能提供的额外类型安全中受益,该功能允许您为所有主键及其引用外键生成记录类型。然后您的查询将显示为:

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

    这会产生与您原来的查询相同的查询,但会安全地键入,而且您永远不会再忘记键列。不仅在查询主键的时候,在加入的时候也一样!更改密钥会导致编译错误:

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

    或者implicit join 看起来像这样:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 2015-06-29
      • 2019-10-14
      • 2013-09-04
      相关资源
      最近更新 更多