有 Java 编程相关的问题?

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

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

我有课程表,学生表,时间表

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):

当我得到结果时,将结果分为学生对象和课程对象的最佳方式是什么?我的意思是因为类型是结果?,我们是否有办法将结果映射到学生、课程实体中,而不是繁琐地执行以下操作:

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

共 (1) 个答案

  1. # 1 楼答案

    答案1

    What's the best way to do join these 3 tables in jooq? I assume it's like [...]

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

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

    答案2

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

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