如何使用 jooq 连接表并获取 json 输出
How to join tables and get the json output using jooq
dslContext.select(
jsonObject(
key("id").value(CATEGORY.ID),
key("courses").value(
jsonArrayAgg(
jsonObject(
Arrays.stream(COURSE.fields())
.map(i -> key(CamelcaseConverter.snakeToCamel(i.getName())).value(
i))
.collect(
Collectors.toList())
)
)
)
)
).from(CATEGORY)
.leftJoin(COURSE_CATEGORY).on(CATEGORY.ID.eq(COURSE_CATEGORY.CATEGORY_ID))
.leftJoin(COURSE).on(COURSE.ID.eq(COURSE_CATEGORY.COURSE_ID)).fetchInto(JSONObject.class)
我得到的输出:
[
{
"courses": [
{
"id": 19
},
{
"id": null
}
],
"name": "Exam1",
"id": 1,
}
]
要求的输出是
[
{
"courses": [
{
"id": 19
}
],
"name": "Exam1",
"id": 1
},
{
"courses":[],
"name": "Exam2",
"id": 2
}
]
需要执行的查询是
“select * 来自 category.id = course_category.category_id 上的类别左外连接 course_category = course_category.course_id = course.id 上的左外连接课程”
如何实施?
您忘记分组依据:
.groupBy(CATEGORY.ID, CATEGORY.NAME)
如果您在 CATEGORY.ID
上有一个主(或唯一)键,那么在 MySQL 中,按该
分组就足够了
.groupBy(CATEGORY.ID)
dslContext.select(
jsonObject(
key("id").value(CATEGORY.ID),
key("courses").value(
jsonArrayAgg(
jsonObject(
Arrays.stream(COURSE.fields())
.map(i -> key(CamelcaseConverter.snakeToCamel(i.getName())).value(
i))
.collect(
Collectors.toList())
)
)
)
)
).from(CATEGORY)
.leftJoin(COURSE_CATEGORY).on(CATEGORY.ID.eq(COURSE_CATEGORY.CATEGORY_ID))
.leftJoin(COURSE).on(COURSE.ID.eq(COURSE_CATEGORY.COURSE_ID)).fetchInto(JSONObject.class)
我得到的输出:
[
{
"courses": [
{
"id": 19
},
{
"id": null
}
],
"name": "Exam1",
"id": 1,
}
]
要求的输出是
[
{
"courses": [
{
"id": 19
}
],
"name": "Exam1",
"id": 1
},
{
"courses":[],
"name": "Exam2",
"id": 2
}
]
需要执行的查询是 “select * 来自 category.id = course_category.category_id 上的类别左外连接 course_category = course_category.course_id = course.id 上的左外连接课程”
如何实施?
您忘记分组依据:
.groupBy(CATEGORY.ID, CATEGORY.NAME)
如果您在 CATEGORY.ID
上有一个主(或唯一)键,那么在 MySQL 中,按该
.groupBy(CATEGORY.ID)