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

Java 从联接查询中读取嵌套对象的最佳方法是什么,java,jooq,Java,Jooq,假设我有一个如下的模型 class Chest { public Id id; public List<Drawer> drawers; public Price price; } class Drawer { public Id id; public Price price; } 根据上述查询结果构造胸部对象的最佳方法是什么 谢谢。一般来说,使用JOIN实现对象图并不能很好地工作,因为在您尝试使用映射算法重新标准化数据之前,您正在将数据库实体反规范化为一个表

假设我有一个如下的模型

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

class Drawer {
  public Id id;
  public Price price;
}
根据上述查询结果构造胸部对象的最佳方法是什么


谢谢。

一般来说,使用
JOIN
实现对象图并不能很好地工作,因为在您尝试使用映射算法重新标准化数据之前,您正在将数据库实体反规范化为一个表(包含重复项)。JPA通过提供一种不公开太多SQL特性的替代查询语言来隐藏这些东西

但是,在您的特定情况下,您可以使用这些方法通过jooqapi来运行它。因此:

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
    ));
}
映射结果=
dsl.selectFrom(…).fetch().intoGroups(CHEST.fields());
列表=新的ArrayList();
for(条目:result.entrySet()){
记录箱=entry.getKey();
结果抽屉=entry.getValue();
列表。添加(新箱子)(
into(Id.class),//这些into(class)方法假定
drawers.into(Drawer.class)//要使用jOOQ的DefaultRecordMapper吗
));
}

上述算法可能不完整,或者不完全符合您的需要。但它将通过jOOQ API让您大致了解开箱即用的可能性。

谢谢Lukas<代码>分组似乎是我所需要的-我会尝试一下。我已经用java的流分组实现了它:
stream().collect(collector.grouping(…)
,但是JOOQ的方法似乎更好,没有太多的样板文件。@Vlad:Yes,
stream
有类似的功能。当然,您可以将Java8API与JooQAPI相结合。顺便说一句,我们发现在jOOQ集成测试中使用Java8时,Java8的局限性很大,这就是我们创建和开放源代码的原因。也许我们还将在其中添加一些有用的分组快捷方式……哈哈,jOOλ-酷酷的名字,看起来像scala的一个端口(Seq:)对不起,这是个离题。
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
    ));
}