簡體   English   中英

從 SelectQuery(或等效項)中提取查詢部分?

[英]Extract query parts from a SelectQuery (or equivalents)?

我有以下情況:

A 類A extends B 其他類,如CD等也擴展B在類B ,我想將邏輯置於ACD共有的一般信息。

因此,我希望在B中有一個一般查詢來檢索所有一般信息,但也能夠將Query傳遞給B以便滿足正確的joincondition 基本上:

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 */)

這可以使用 JOOQ 嗎? 除非絕對必要,否則我真的不想使用普通的 SQL 執行。


編輯:

使用以下答案,這是我非常滿意的最終代碼:

public Record getB(String bUuid, Consumer<SelectQuery> extender)

我稱之為:

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

在 getB 中,在進行“常規” SelectQuery query ,我們只需調用:

extender.apply(query);

之后我們可以簡單地使用我們的增強查詢執行query.fetchOne()

考慮函數式,而不是面向對象! 這將是一個更簡單的方法:

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%"))
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM