如何减少此通用jOOQ查询中的接口方法数量

时间:2017-08-31 23:52:53

标签: java generics jooq

    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;
}

0 个答案:

没有答案