从SelectQuery(或等价物)中提取查询部分?

时间:2017-01-09 14:03:23

标签: java postgresql jooq sqlbuilder

我有以下情况:

班级A extends B。其他类(例如CD等)也会扩展B在类B中,我想根据{{1}常见的一般信息来定位逻辑}},AC

因此,我希望D中的常规查询可以检索所有常规信息,但也可以将B传递给Query,以便正确{{1}完成了s和B s。基本上是:

join

使用JOOQ可以吗?除非绝对必要,否则我真的不想使用纯SQL执行。

编辑:

使用以下答案,这是我对我非常满意的最终代码:

condition

我打电话如下:

public B getB(String bUuid, Query extendedQuery) {

    SelectQuery bQuery = ... dsl.select(/* general B columns */)
                                .select(/* SELECT part from extended query */)
                                .from(/* general B tables */)
                                .from(/* FROM part from extended query */) // maybe join with some if else logic instead 
                                .where(/* general B conditions */)
                                .where(/* WHERE part of extended query */)

在getB中,在制作了我们的&#34; general&#34; public Record getB(String bUuid, Consumer<SelectQuery> extender) ,我们只需致电:

Record r = B.getB(uuid, query -> {
    query.addSelect(...);
    query.addJoin(...);
}

之后我们可以使用增强的查询执行SelectQuery query

1 个答案:

答案 0 :(得分:1)

思考功能,而不是面向对象!这将是一个更简单的方法:

public B getB(
    String bUuid,
    Supplier<? extends Collection<? extends Field<?>>> select,
    Supplier<? extends Collection<? extends Table<?>>> from,
    Supplier<? extends Collection<? extends Condition>> where
) {
    List<Field<?>> allSelect = new ArrayList<>();
    allSelect.addAll(/* general B columns */);
    allSelect.addAll(select.get());

    List<Table<?>> allFrom = new ArrayList<>();
    allFrom.addAll(/* general B tables */);
    allFrom.addAll(from.get());

    List<Table<?>> allWhere = new ArrayList<>();
    allWhere.addAll(/* general B conditions*/);
    allWhere.addAll(where.get());

    dsl.select(allSelect)
       .from(allFrom)
       .where(allWhere);
}

现在,您可以像这样调用此高阶函数:

getB(
    uuid,
    () -> Arrays.asList(A.COL1, A.COL2, A.COL3),
    () -> Arrays.asList(A),
    () -> Arrays.asList(A.B_ID.eq(B.ID), A.COL4.like("%ABC%"))
);