我有三张桌子:
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"
}
]
}
]
获取嵌套 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();