我一直在try JOOQ 3.17的一些新特性,例如类型安全的嵌套表记录与隐式连接混合在一起,如下所述:

https://blog.jooq.org/projecting-type-safe-nested-tablerecords-with-jooq-3-17/

我们有一个复杂的视图,您可以在其中修改"公司"对象的许多属性.我们的旧代码在一个相当大的UI上有无数Hibernate方法来CRUD COMPANY对象的相关记录.现在我想用JOOQ重写这段代码.我想出了一个查询来拉出一个CompanyRecord和相关记录,如下所示:

Record4<CompanyRecord, Result<ServiceCompanyPreferenceRecord>, Result<SubsidiaryRecord>, Result<CompanyCo2ParameterRecord>> fancyTypeResult =
        dslContext.get().select(
                        Tables.COMPANY,
                        multiset(
                                selectFrom(Tables.SERVICE_COMPANY_PREFERENCE)
                                        .where(Tables.SERVICE_COMPANY_PREFERENCE.COMPANY_ID.eq(Tables.COMPANY.ID))
                        ),
                        multiset(
                                selectFrom(Tables.SUBSIDIARY)
                                        .where(Tables.SUBSIDIARY.COMPANY_ID.eq(Tables.COMPANY.ID))
                        ),
                        multiset(
                                selectFrom(Tables.COMPANY_CO2_PARAMETER)
                                        .where(Tables.COMPANY_CO2_PARAMETER.COMPANY_ID.eq(Tables.COMPANY.ID))
                        )
                )
                .from(Tables.COMPANY)
                .where(Tables.COMPANY.ID.eq(companyId))
                .fetchOne();

这非常棒,因为我可以修改和保存CompanyRecord或和相关的ServiceCompanyPferenceRecord、SubsidiaryRecord或CompanyCo2参数记录,并且数据库中的那些行将被更新.

我遇到的一个问题是传递类型"Record4<CompanyRecord, Result<ServiceCompanyPreferenceRecord>, Result<SubsidiaryRecord>, Result<CompanyCo2ParameterRecord>>"相当冗长.所以有一个功能,可以找到一家公司所有这样的记录

public Record4<CompanyRecord, Result<ServiceCompanyPreferenceRecord>, Result<SubsidiaryRecord>, Result<CompanyCo2ParameterRecord>> loadCompanyAndRelatedPreferences(Long companyId){ ....

这可能有点不对劲.我想知道,如果简单地创建一个包含类型为"Record4<CompanyRecord, Result<ServiceCompanyPreferenceRecord>, Result<SubsidiaryRecord>, Result<CompanyCo2ParameterRecord>>"的字段的POJO会不会更容易,因为我可以使用该POJO,而无需反复重写该类型.另一种 idea 是,这是Java记录的好用例吗?

我们有许多屏幕都遵循这种模式.调出一条记录和相关记录,清理它们.你有什么好办法来处理这件事吗?

推荐答案

你可以用convertFrommapping.这里有一个来自https://github.com/72services/jtaf4个人的例子

return dsl
        .select(
            COMPETITION.NAME,
            COMPETITION.COMPETITION_DATE,
            COMPETITION.ALWAYS_FIRST_THREE_MEDALS,
            COMPETITION.MEDAL_PERCENTAGE,
            multiset(
                select(
                    CATEGORY.ABBREVIATION,
                    CATEGORY.NAME,
                    CATEGORY.YEAR_FROM,
                    CATEGORY.YEAR_TO,
                    multiset(
                        select(
                            CATEGORY_ATHLETE.athlete().FIRST_NAME,
                            CATEGORY_ATHLETE.athlete().LAST_NAME,
                            CATEGORY_ATHLETE.athlete().YEAR_OF_BIRTH,
                            CATEGORY_ATHLETE.athlete().club().NAME,
                            multiset(
                                select(
                                    RESULT.event().ABBREVIATION,
                                    RESULT.RESULT_,
                                    RESULT.POINTS
                                )
                                    .from(RESULT)
                                    .where(RESULT.ATHLETE_ID.eq(CATEGORY_ATHLETE.athlete().ID))
                                    .and(RESULT.COMPETITION_ID.eq(COMPETITION.ID))
                                    .and(RESULT.CATEGORY_ID.eq(CATEGORY.ID))
                                    .orderBy(RESULT.POSITION)
                            ).convertFrom(r -> r.map(mapping(CompetitionRankingData.Category.Athlete.Result::new)))
                        )
                            .from(CATEGORY_ATHLETE)
                            .where(CATEGORY_ATHLETE.CATEGORY_ID.eq(CATEGORY.ID))
                    ).convertFrom(r -> r.map(mapping(CompetitionRankingData.Category.Athlete::new)))
                )
                    .from(CATEGORY)
                    .where(CATEGORY.SERIES_ID.eq(COMPETITION.SERIES_ID))
                    .orderBy(CATEGORY.ABBREVIATION)
            ).convertFrom(r -> r.map(mapping(CompetitionRankingData.Category::new)))
        )
        .from(COMPETITION)
        .where(COMPETITION.ID.eq(competitionId))
        .fetchOne(mapping(CompetitionRankingData::new));

Java相关问答推荐

RxJava PublishSubject缓冲区元素超时

使用JdkClientHttpRequestFactory通过Spring RestClient和Wiemock读取时达到EOF

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

连接Quarkus中的两个异步操作

我可以在MacOS上使用什么Java函数来在适当的设备上以适当的音量播放适当的alert 声音?

Log4j与jdk21兼容吗?

使用存储在字符串变量中的路径目录打开.pdf文件

在Eclipse中调试未导出的JDK模块的Java包

将PNG转换为位图自定义十六进制字符串

在VS代码中,如何启用Java Main函数的&Q;Run|DEBUG&Q;代码?

是否在settings.xml中使用条件Maven镜像?

如何使这两种方法合二为一?

何时调用密封层次 struct 的switch 中的默认情况

在不使用instanceof或强制转换的情况下从父类变量调用子类方法

在缺少字段时使用Jackson With Options生成Optional.Empty()

如何使用WebEnvironment.RANDOM_PORT获得第二个随机端口?

如何在Spring Boot Auth服务器上正确配置CORS?

HBox内部的左对齐按钮(如果重要的话,在页码内)

如何在更改分辨率时将鼠标坐标计算为世界坐标

与配置类中的自动装配字段相反是什么意思?