在连接嵌套查询时选择要加入的字段

时间:2015-04-02 13:07:09

标签: java sql jooq

我最近一直在迁移我的数据库,并且已经将剩余的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应答中所述重新命名子查询的路线,但这些类型不适合我。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

所以我发现了我认为现在的解决方案。但是,这似乎是一种解决方法。我在进行连接时给出了子查询名称,并使用该名称指向该字段。如果我的架构将来发生变化,我认为这不会标记编译时错误。

这是任何有兴趣的人:

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