【发布时间】:2022-08-15 14:18:18
【问题描述】:
我一直在使用 JOOQ 3.17 的一些新功能,例如类型安全的嵌套表记录与隐式连接混合,如下所述:
https://blog.jooq.org/projecting-type-safe-nested-tablerecords-with-jooq-3-17/
我们有一个复杂的视图,您可以在其中修改“公司”对象的许多属性。我们的旧代码在一个相当大的 UI 上为公司对象的 CRUD 相关记录提供了不计其数的休眠方法。现在我想在 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 或相关的 ServiceCompanyPreferenceRecord、SubsidiaryRecord 或 CompanyCo2ParameterRecord,并且数据库中的这些行已更新。
我遇到的一个问题是传递类型\"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 而无需一遍又一遍地重写该类型。另一个想法是这是 Java 记录的一个很好的用例吗?
我们有许多遵循这种模式的屏幕。拉记录和相关记录,对它们进行 CRUD。关于处理这个问题的好方法有什么想法吗?
-
看起来我可以调用 fetchInto(SomeRecordClass.class) 但这没有编译时间检查 JOOQ 的结果是否与 Record Class 的构造函数匹配。记录是指JDK16记录。