JOOQ 如何在连接多个表时生成唯一列表

问题描述 投票:0回答:1

我有三张桌子:

SchoolTable
SchoolOrgTable
SchoolDetailsTable
。这些表之间的关系如下:

  • SchoolTable
    SchoolOrgTable
    是一对多关系。
  • SchoolOrgTable
    SchoolDetailsTable
    是多对一关系。

我目前正在使用 JOOQ 查询从这些表中检索数据,如下所示:

SelectJoinStep<Record> result = dsl.select()
    .from(SchoolTable)
    .join(SchoolOrgTable)
    .on(SchoolTable.A_ID.eq(SchoolOrgTable.ATest_ID))
    .leftJoin(SchoolOrgTable)
    .on(SchoolTable.A_ID.eq(SchoolOrgTable.B_Id))
    .leftJoin(SchoolDetailsTable)
    .on(SchoolDetailsTable.C_ID.eq(SchoolOrgTable.B_ID));

但是,我得到的结果是为每个关联的

schoolId
复制
SchoolDetails
。这是我目前得到的示例:

[
  {
    "schoolId": 1,
    "schoolName": "JaySchool",
    "isActive": true,
    "SchoolDetails": [
      {
        "detailsID": 1,
        "detailsName": "H121",
        "details": "schoolIsGood"
      }
    ]
  },
  {
    "schoolId": 1,
    "schoolName": "JaySchool",
    "isActive": true,
    "SchoolDetails": [
      {
        "detailsID": 2,
        "detailsName": "H122",
        "details": "awesome"
      }
    ]
  },
  {
    "schoolId": 2,
    "schoolName": "TermSchool",
    "isActive": true,
    "SchoolDetails": [
      {
        "detailsID": 3,
        "detailsName": "H135",
        "details": "Nice"
      }
    ]
  }
]

我希望结果的结构如下,每个 schoolId 与其 SchoolDetails 相关联:

[
  {
    "schoolId": 1,
    "schoolName": "JaySchool",
    "isActive": true,
    "SchoolDetails": [
      {
        "detailsID": 1,
        "detailsName": "H121",
        "details": "schoolIsGood"
      },
      {
        "detailsID": 2,
        "detailsName": "H122",
        "details": "awesome"
      }
    ]
  },
  {
    "schoolId": 2,
    "schoolName": "TermSchool",
    "isActive": true,
    "SchoolDetails": [
      {
        "detailsID": 3,
        "detailsName": "H135",
        "details": "Nice"
      }
    ]
  }
]
java postgresql jooq
1个回答
0
投票

获取嵌套 JSON 文档的最简单方法是使用 jOOQ 的 SQL/JSON 支持,例如

JSON_ARRAYAGG
。例如:

dsl.select(jsonObject(
        key("schoolId").value(SCHOOL.ID),
        key("schoolName").value(SCHOOL.NAME),
        key("isActive").value(SCHOOL.ACTIVE),
        key("SchoolDetails").value(jsonArrayAgg(jsonObject(
            key("detailsID").value(SCHOOL_DETAILS.ID),
            key("detailsName").value(SCHOOL_DETAILS.NAME),
            key("details").value(SCHOOL_DETAILS.DETAILS)
        )))
    ))
    .from(SCHOOL)
    .leftJoin(SCHOOL_DETAILS)
    .on(SCHOOL_DETAILS.SCHOOL_ID.eq(SCHOOL.ID))
    .fetch();
© www.soinside.com 2019 - 2024. All rights reserved.