2015-04-02 125 views
0

我最近一直在遷移我的數據庫並將其餘的SQL查詢移至jooq。有一些有趣的這一個:然後選擇要在加入嵌套查詢時加入的字段

private SelectQuery<?> getIdeasQuery() { 
    Select<?> numComments = dslContext.select(DSL.count().as("comment_count"), COMMENT.IDEA_ID).from(COMMENT).groupBy(COMMENT.IDEA_ID); 
    Select<?> numLikes = dslContext.select(DSL.count().as("like_count"), USER_LIKES_IDEA.IDEA_ID).from(USER_LIKES_IDEA).groupBy(USER_LIKES_IDEA.IDEA_ID); 

    return dslContext 
     .select(DSL.field("comment_count").as("num_comments")) 
     .select(DSL.field("like_count").as("num_likes")) 
     .select(USER.DISPLAY_NAME) 
     .select(USER.AUTHORITY) 
     .select(IDEA.fields()) 
     .from(IDEA.leftOuterJoin(numComments).on(COMMENT.IDEA_ID.eq(IDEA.ID)) 
       .leftOuterJoin(numLikes).on(USER_LIKES_IDEA.IDEA_ID.eq(IDEA.ID)) 
       .leftOuterJoin(USER).on(IDEA.USER_ID.eq(USER.ID))) 
     .getQuery(); 
} 

返回的查詢被用來追加更多的修飾符(使用addConditions()addOrderBy()addLimit()等)根據上下文,然後執行。

我遇到的問題是兩個子選擇查詢沒有被命名爲它們的連接的原始名稱。這是正確的行爲!但是,在jOOQ中,我很難找到如何指定子查詢的字段加入。我試着按照this StackOverflow的回答重新命名子查詢的路線,但是這些類型並不適合我。

任何想法?

回答

0

所以我發現我認爲現在是一個解決方案。但是,它似乎是一種解決方法。我在進行連接時給出了子查詢名稱,並使用該名稱指向該字段。如果我的模式將來發生變化,我不認爲這會標記編譯時錯誤。

這是任何人都感興趣的是:

private SelectQuery<?> getIdeasQuery() { 
    Select<?> numComments = dslContext.select(DSL.count().as("comment_count"), COMMENT.IDEA_ID).from(COMMENT).groupBy(COMMENT.IDEA_ID); 
    Select<?> numLikes = dslContext.select(DSL.count().as("like_count"), USER_LIKES_IDEA.IDEA_ID).from(USER_LIKES_IDEA).groupBy(USER_LIKES_IDEA.IDEA_ID); 

    return dslContext 
      .select(DSL.field("comment_count").as("num_comments")) 
      .select(DSL.field("like_count").as("num_likes")) 
      .select(USER.DISPLAY_NAME) 
      .select(USER.AUTHORITY) 
      .select(IDEA.fields()) 
      .from(IDEA.leftOuterJoin(numComments.asTable("com")).on(DSL.field("com.idea_id").eq(IDEA.ID)) 
        .leftOuterJoin(numLikes.asTable("like")).on(DSL.field("like.idea_id").eq(IDEA.ID)) 
        .leftOuterJoin(USER).on(IDEA.USER_ID.eq(USER.ID))) 
      .getQuery(); 
}