2017-01-09 22 views
1

我有以下情況:從SelectQuery(或等價物)中提取查詢部分?

A extends B。其他類,如C,D等也擴展B在類B,我想關於A,CD共同的一般信息的邏輯。

因此,我想在B檢索所有的一般信息一般查詢,也可以通過一個QueryB以便正確join S和condition s的滿足。基本上:

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中,在使我們的「general」SelectQuery query後,我們只需調用:

extender.apply(query); 

之後我們可以簡單地用我們的增強型查詢做query.fetchOne()

回答

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

非常感謝您的回覆埃德爾先生!以您的建議爲基礎,我將上面編輯的解決方案帶入了我的問題。我也非常感謝您花時間回答SO的問題。 :) – user991710

+0

@ user991710:不客氣!哦,有趣的方法,使用消費者。注意:你也可以在Stack Overflow上回答你自己的問題。這將使它成爲未來訪客更有趣的問題 –