从连接查询中读取嵌套对象的最佳方法是什么?

时间:2014-12-22 22:48:57

标签: java jooq

假设我有一个类似以下的模型

class Chest {
  public Id id;
  public List<Drawer> drawers;
  public Price price;
}

class Drawer {
  public Id id;
  public Price price;
}

使用抽屉获取Chest对象的JOOQ查询:

dsl.selectFrom(CHEST.join(DRAWERS).onKey()).where(CHEST.ID.eq(1)).fetch()

从上面的查询结果构建Chest对象的最佳方法是什么?

感谢。

1 个答案:

答案 0 :(得分:1)

通常,使用JOIN来实现对象图并不能很好地工作,因为在尝试在映射算法中再次规范化数据之前,将数据库实体非规范化为表(具有重复项) 。 JPA通过提供一种不暴露如此多SQL功能的替代查询语言来隐藏这些东西。

但是,在您的特定情况下,您可以使用Result.intoGroups()方法通过jOOQ API运行此操作。因此:

Map<Record, Result<Record>> result = 
    dsl.selectFrom(...).fetch().intoGroups(CHEST.fields());

List<Chest> list = new ArrayList<>();
for (Entry<Record, Result<Record>> entry : result.entrySet()) {
    Record chest = entry.getKey();
    Result<Record> drawers = entry.getValue();

    list.add(new Chest(
        chest.into(Id.class),      // These into(Class<?>) methods assume that you
        drawers.into(Drawer.class) // want to use jOOQ's DefaultRecordMapper
    ));
}

上述算法可能不完整,或者不完全符合您的要求。但它会让你大致了解通过jOOQ API可以开箱即用的东西。