将jooq记录数据映射到多个pojo

问题描述

我们有多个表,如:

  • 一对一教学学校
  • 一对一授课的老师
  • 一对一教学

实体如下

   public class School {
    
        private String name;
        private long id;
        private List<teacher> teachers;

   public School() {
    }
}


public class teachers {

    private String name;
    private Long id;
    private List<Subject> subjects;
    private List<Classes> classes;

}

public class  Subject {

    private String name;
    private long id;

    public Subject() {
    }
}

public class Classes{

    private String name;
    private long id;
        public Classes() {
    }
}

我们已经为所需字段编写了jooq查询。对于单个学校数据,我们得到的是多行而不是预期的行。但是,我们无法映射数据。

我们尝试过:

  • ModelMapper(无法找到将多个基本水平(表)记录转换为垂直记录的方法)

  • intoGroups()仅工作到 单连接(两个表)

  • simpleflatmapper相同的问题

有什么方法可以实现它。我们错过了什么吗?

PS:作为回应,我们不需要所有表中的所有列(变量)。

解决方法

从历史上看,这是jOOQ最缺少的功能之一:)

jOOQ 3.14 and the new SQL/XML and SQL/JSON support开始,这将相对容易地实现。本质上,您将使用RDBMS的本机XML或JSON支持直接在SQL中嵌套集合。 (您注意到,所有其他使用联接并尝试将重复数据消除和重复数据删除结果集嵌套数据结构的方法都不能很好地工作)

您可以编写这样的查询(假设您使用代码生成器,并假设您对顶部为School的树结构感兴趣)

List<School> schools =
ctx.select(jsonObject(
     jsonEntry("name",SCHOOL.NAME),jsonEntry("id",SCHOOL.ID),jsonEntry("teachers",jsonArrayAgg(jsonObject(
       jsonEntry("name",TEACHER.NAME),TEACHER.ID),jsonEntry("subjects",field(
         select(jsonArrayAgg(jsonObject(SUBJECT.NAME,SUBJECT.ID)))
         .from(SUBJECT)
         .where(SUBJECT.TEACHER_ID.eq(TEACHER.ID))
       )),jsonEntry("classes",field(
         select(jsonArrayAgg(jsonObject(CLASS.NAME,CLASS.ID)))
         .from(CLASS)
         .where(CLASS.TEACHER_ID.eq(TEACHER.ID))
       ))
     )))
   ))
   .from(SCHOOL)
   .join(TEACHER).on(TEACHER.SCHOOL_ID.eq(SCHOOL.ID))
   .groupBy(SCHOOL.NAME,SCHOOL.ID)
   .fetchInto(School.class);

此解决方案基于架构的假设,即SUBJECT -> TEACHERCLASS -> TEACHER之间存在一对一的关系。

此外,您可以看到我仍在每个TEACHER的组SCHOOL上使用联接,使用JSON_ARRAYAGG()聚集教师。这是一个选项,也可以使用针对SUBJECTCLASS的另一个相关子查询。

使用SQL Server's FOR JSON clause可以实现更简单的解决方案,可以在其他方言中进行仿真。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...