java JOOQ查询未映射多级(onetomany相关)自定义POJO上的结果
|Table1| 1 n |Table2| 1 n |Table 3|
| | --------------> | | --------------> | |
| | | | | |
-------- -------- --------
(experiment) (tags) (TagDescription)
我试图将上述三个one-to-many
链接表中的数据映射到下面的DTO。然而,Jooq查询并没有像预期的那样工作。表1和表3的值映射正确,但表2的值都是Null
。这是DTO
class ExperimentDto {
long id;
String name;
List<TagDto> tags;
}
class TagDto {
long id;
long experimentId;
String name;
List<TagDescriptionDto> tagDescription;
}
class TagDescriptionDto {
long id;
long tadId;
String description;
}
。。。这是我的query
。我从this答案中引用来编写我的查询
dslContext.select(
Experiment.asterisk(), // map all the Experiment table field to DTO
field(
select(
jsonArrayAgg(jsonObject(
jsonEntry(jsonObject(Tag.fields())), // map all the Tag table field to DTO + ONE-to-Many with TagDescription but these fields are all NULL
jsonEntry("tagDescription", field(
select(jsonArrayAgg(jsonObject(TagDescription.fields())))
.from(orderDetailAddition)
.where(TagDescription.ID.eq(Tag.ID))))
)
)
).from(Tag)
.where(Tag.eq(Experiment.ID))
).as("tags")
).from(Experiment)
.where(Experiment.NAME.eq("Name"))
.fetchInto(ExperimentDto.class);
谁能给我一个提示,询问中遗漏了什么和错了什么。显然,这部分有一些问题
此外,在DTO上读取和映射这样的关系是一种好方法(查询中的jsonmappers),还是我们可以使用Jooq
以更好的方式来实现?(无法使用multiset,因为我在3.14上)
更新:
更新为JOOQ3.15.4
,并开始使用MULTISET,但现在我在最简单的查询中得到了BAD SQL
异常。我写的这个查询抛出了一个错误。由于某种原因,它无法在嵌套查询中找到experiment.id
SELECT
experiment.id,
experiment.name,
(SELECT
COALESCE(JSON_MERGE_PRESERVE('[]',
CONCAT('[',
GROUP_CONCAT(JSON_ARRAY(v0)
SEPARATOR ','),
']')),
JSON_ARRAY())
FROM
(SELECT
tags.name AS v0
FROM
tags
WHERE
(tags.experiment_id = experiment.id)) AS t) AS tags
FROM
experiment
WHERE
experiment.id > 0;
Error Code: 1054. Unknown column 'experiment.id' in 'where clause'
MySQL version: 5.7.35
共 (0) 个答案