public interface BranchHistoryDao<B extends UpdatableRecord<B>, H extends UpdatableRecord<H>, P extends UpdatableRecord<P>, PH extends UpdatableRecord<PH>> extends TableDao<H> {
default void saveHistoryForParentIds(Collection<Integer> parentIds) {
HashMap<TableField<B, ?>, TableField<H, ?>> mappings = setUpHistoryMapping();
List<TableField<H, ?>> historyFields = new ArrayList<>(mappings.size()); // ArrayLists will maintain order
List<TableField<?, ?>> tableFields = new ArrayList<>(mappings.size());
mappings.forEach((key, value) -> {
historyFields.add(value);
tableFields.add(key);
});
historyFields.add(historyToParentHistoryFK());
tableFields.add(parentHistoryPK());
List<Integer> latestHistories = jooq()
.select(DSL.max(parentHistoryPK()))
.from(parentHistoryTable())
.groupBy(parentHistoryToParentFK())
.fetchInto(Integer.class);
jooq()
.insertInto(
table(),
historyFields)
.select(
jooq()
.select(
tableFields)
.from(baseTable())
.join(parentTable())
.on(parentPK().eq(baseToParentFK()))
.join(parentHistoryTable())
.on(parentHistoryToParentFK().eq(parentPK()))
.where(parentPK().in(parentIds))
.and(parentHistoryPK().in(latestHistories)))
.execute();
}
HashMap<TableField<B, ?>, TableField<H, ?>> setUpHistoryMapping();
TableField<B, Integer> basePK();
Table<PH> parentHistoryTable();
TableField<PH, Integer> parentHistoryPK();
TableField<PH, Integer> parentHistoryToParentFK();
TableField<H, Integer> historyToParentHistoryFK();
Table<B> baseTable();
TableField<B, Integer> baseToParentFK();
Table<P> parentTable();
TableField<P, Integer> parentPK();
}
我有一个将4个表连接在一起的通用jooq查询,但我有一堆接口可以获取某些属性,例如TableField<B, Integer> basePK();
;我相信像TableField<B, Integer> basePK();
和parentHistoryTable();
这样的函数是多余的,因为我需要的所有信息都已在泛型中定义。
但是,问题是我无法实例化泛型。如果我可以(new B()).getTable()
我可以轻松获得baseTable()
或(new B()).getTable().field("id")
来获取basePK(),但由于类型擦除,我无法做到。有没有人有解决方案来删除这些冗余方法?
这是setUpHistoryMapping()看起来像
的一个例子@Override
public HashMap<TableField<MilestoneRecord, ?>, TableField<MilestoneHistoryRecord, ?>> setUpHistoryMapping() {
HashMap<TableField<MilestoneRecord, ?>, TableField<MilestoneHistoryRecord, ?>> x = new HashMap<>();
x.put(MILESTONE.LABEL, MILESTONE_HISTORY.LABEL);
x.put(MILESTONE.BASELINE_DATE, MILESTONE_HISTORY.BASELINE_DATE);
x.put(MILESTONE.IS_COMPLETE, MILESTONE_HISTORY.IS_COMPLETE);
x.put(MILESTONE.DELETED_FLAG, MILESTONE_HISTORY.DELETED_FLAG);
return x;
}
和
@Override
public Table<MilestoneRecord> baseTable() {
return MILESTONE;
}