有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案