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

时间:2016-07-14 22:30:40

标签: java join mapping jooq

我有COURSE,STUDENT,SCHEDULE表。

table course(id, name, ....), 
table student(id, name, ...), 
table schedule(id, c_id, s_id).

现在我想把课程和学生表留下连接时间表。

问题(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();

问题(2):

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

for(Record r: result){
   Student s = new Student(r.filed(), r.filed()...);
   Course c = new Course(r.filed(), r.filed()....)
}

1 个答案:

答案 0 :(得分:10)

答案1

  

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

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

  1. 为没有值的SQL语句添加复杂性,例如:在维护声明时
  2. 防止某些数据库处理不良的派生表的优化
  3. 相反,只需在一个语句中加入两个表:

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

    答案2

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

    for (Record r : result) {
        StudentRecord s = r.into(STUDENT);
        CourseRecord c = r.into(COURSE);
    }