当前位置: 首页 > 知识库问答 >
问题:

在jOOQ多集查询中重用RecordMapper

仇征
2023-03-14

假设我们有一个表汽车零件。要获取所有汽车及其零件,我们使用以下查询:

@Transactional
public List<ReadCarDto> getAllCars() {
    return getDslContext().select(
        CAR.ID,
        CAR.NAME,
        CAR.DESCRIPTION,
        multiset(
            selectDistinct(
                PARTS.ID,
                PARTS.NAME,
                PARTS.TYPE,
                PARTS.DESCRIPTION
            ).from(PARTS).where(PARTS.CAR_ID.eq(CAR.ID))
        ).convertFrom(record -> record.map(record1 -> new ReadPartDto(
            record1.value1(),
            record1.value2(),
            record1.value3(),
            record1.value4()
        )))
    ).from(CAR).fetch(record -> new ReadCarDto(
        record.value1(),
        record.value2(),
        record.value3(),
        record.value4()
    ));
}

问:我总是想取整车和零件排。有没有办法重用我现有的私有RecordMapper

看起来selectDistinct方法只支持1-22个字段和select()。from(CAR)不提供multiset方法。

旁注:我不想使用反射转换。


共有1个答案

贲宜春
2023-03-14

你的问题让我想起了这个。您可能希望使用嵌套行()表达式来生成嵌套记录。比如:

return getDslContext()
    .select(
        row(
            CAR.ID,
            CAR.NAME,
            CAR.DESCRIPTION,
            ...
        ).mapping(carMapper),
        multiset(...)
    )

未来的jOOQ版本将允许您在投影中直接使用CAR作为嵌套行,请参阅https://github.com/jOOQ/jOOQ/issues/4727.截至Jooq3.16,这还不可用。

 类似资料:
  • 我尝试在项目中使用jooq,但出于性能原因,我希望缓存查询。在性能考虑部分的用户手册中,提到了查询缓存,但没有关于如何实现的示例。因此,我尝试按如下方式缓存查询(例如SimpleSelectConditionStep): 我的软件是一个多线程的web应用程序,但可以保证两个不同的线程不能同时使用相同的查询(池在再次放入池之前不会返回相同的查询)。 我知道比工厂不是一个线程安全的对象,但我想知道在代

  • 在Jooq中运行上述查询的最佳方式是什么?我知道我可以用普通SQL编写查询,但我想看看是否有更好的方法来实现这一点。

  • 我如何写问题。*在jooq中而不是指定所有实体vaiables

  • 我需要从一个非常大的表中选择一个“页”的数据。由于WHERE子句和需要分页到相当大的偏移量,我使用一个子查询来获取ID。只有在末尾放置时,此策略才有效。这导致(我认为)到数据库的额外往返。有什么方法可以避免额外的? 附言。我这样做的原因是由于orderBy/offset/limit用于大偏移量(我选择的列之一由于是blob类型,不适合添加到索引中,所以我不能创建覆盖索引)。

  • 我正试图用jooq编写这个查询 我尝试了几件事,但没有成功。到目前为止,我只得到 如何将num列添加到结果中?感谢您的帮助。

  • 问题内容: 我现在将Pure SQL转换为jOOQ 我必须在jOOQ中编写此代码,我们该如何编写? 问题答案: 实现您所请求内容的最直接的方法是使用: 另外,您可以显式表达该功能: 还有另一种方法来获取任意表达式,这可以帮助您避免在上述方法中指定结果列索引和类型。它使用: 但是请注意,这会呈现如下嵌套选择: