如何解决将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 -> TEACHER
和CLASS -> TEACHER
之间存在一对一的关系。
此外,您可以看到我仍在每个TEACHER
的组SCHOOL
上使用联接,使用JSON_ARRAYAGG()
聚集教师。这是一个选项,也可以使用针对SUBJECT
和CLASS
的另一个相关子查询。
使用SQL Server's FOR JSON
clause可以实现更简单的解决方案,可以在其他方言中进行仿真。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。