如何使用jooq连接3个表并迭代结果?

Fre*_*Ren 4 java mapping join jooq

我有COURSE,STUDENT,SCHEDULE表.

table course(id, name, ....), 
table student(id, name, ...), 
table schedule(id, c_id, s_id).
Run Code Online (Sandbox Code Playgroud)

现在我想离开连接时间表与课程和学生表.

问题(1):

在jooq中加入这3个表的最佳方法是什么?我假设它是这样的:

TableLike<?> firstjoin = sql
    .select()
    .from(Tables.SCHEUDLE)
    .leftOuterJoin(Tables.COURSE)
    .on(Tables.SCHEDULE.CID.eq(Tables.COURSE.ID))
    .asTable();

Result<?> result = sql
    .select()
    .from(firstjoin)
    .leftOuterJoin(Tables.STUDENT)
    .on(Tables.SCHEDULE.SID.eq(Tables.STUDENT.ID))
    .fetch();
Run Code Online (Sandbox Code Playgroud)

问题2):

当我得到结果时,将结果拆分为Student对象和Course对象的最佳方法是什么?我的意思是因为类型是结果?,有没有什么方法可以将结果映射到学生,课程实体而不是繁琐地做这样的事情:

for(Record r: result){
   Student s = new Student(r.filed(), r.filed()...);
   Course c = new Course(r.filed(), r.filed()....)
}
Run Code Online (Sandbox Code Playgroud)

Luk*_*der 12

答案1

在jooq中加入这3个表的最佳方法是什么?我认为它就像[...]

虽然你的查询是正确的,但我不会像你那样加入.您的方法创建了一个派生表

  1. 在没有值的情况下为SQL语句添加复杂性,例如在维护语句时
  2. 在某些处理派生表的数据库中阻止优化

相反,只需在一个语句中连接两个表:

Result<?> result = sql
    .select()
    .from(SCHEUDLE)
    .leftOuterJoin(COURSE)
    .on(SCHEDULE.CID.eq(COURSE.ID))
    .leftOuterJoin(STUDENT)
    .on(SCHEDULE.SID.eq(STUDENT.ID))
    .fetch();
Run Code Online (Sandbox Code Playgroud)

答案2

您可以使用各种Record.into()方法之一,例如Record.into(Table)

for (Record r : result) {
    StudentRecord s = r.into(STUDENT);
    CourseRecord c = r.into(COURSE);
}
Run Code Online (Sandbox Code Playgroud)