【问题标题】:What is the best way to read nested object from a join query从联接查询中读取嵌套对象的最佳方法是什么
【发布时间】:2014-12-23 17:03:35
【问题描述】:

假设我有一个像下面这样的模型

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

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

还有一个 JOOQ 查询来获取带有抽屉的 Chest 对象:

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

根据上述查询结果构造 Chest 对象的最佳方法是什么?

谢谢。

【问题讨论】:

    标签: java jooq


    【解决方案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 开箱即用的功能。

    【讨论】:

    • 谢谢卢卡斯! intoGroups 似乎是我需要的 - 我会试一试。我已经使用 java 的流分组实现了它:stream().collect(Collectors.grouping(...)) 但 JOOQ 的方式似乎肯定更好,样板更少。
    • @Vlad:是的,Stream 具有类似的功能。当然,您可以将 Java 8 API 与 jOOQ API 结合使用。顺便说一句,我们发现在 jOOQ 集成测试中使用 Java 8 时非常限制自己,这就是我们创建并开源 jOOλ 的原因。也许我们还会在其中添加一些有用的分组快捷方式...
    • 哈哈,jOOλ - 很酷的名字,看起来像 scala 的 Seq 的一个端口 :) 抱歉跑题了。
    猜你喜欢
    • 2020-08-10
    • 2023-03-27
    • 2021-10-23
    • 1970-01-01
    • 2012-12-29
    • 2021-01-06
    • 1970-01-01
    • 2012-03-31
    • 1970-01-01
    相关资源
    最近更新 更多