【问题标题】:How to join 3 tables and iterate results using jooq?如何使用 jooq 连接 3 个表并迭代结果?
【发布时间】:2016-11-18 00:32:53
【问题描述】:

我有 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 对象的最佳方法是什么?我的意思是,既然类型是 Result?,我们有什么办法可以将结果映射到学生、课程实体中,而不是像这样乏味地做这样的事情:

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

【问题讨论】:

    标签: java join mapping jooq


    【解决方案1】:

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

    回答 2

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

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

    【讨论】:

    • 我们如何将Record.into 用于具有相似列名的表的聚合记录?
    • @AskarKalykov:这与这个问题有什么不同?不要回答。问一个新问题:-)
    猜你喜欢
    • 2016-04-13
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    相关资源
    最近更新 更多