Java 连接嵌套查询时选择要连接的字段
我最近一直在迁移我的数据库,并且一直在将剩余的SQL查询转移到jooq。享受这一点的乐趣:Java 连接嵌套查询时选择要连接的字段,java,sql,jooq,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<?
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();
}
private SelectQuery getIdeasQuery(){
选择numComments=dslContext.Select(DSL.count().as(“comment\u count”),comment.IDEA\u ID).from(comment.groupBy(comment.IDEA\u ID);
选择numLikes=dslContext.Select(DSL.count().as(“like_count”),USER_LIKES_IDEA.IDEA_ID)。from(USER_LIKES_IDEA.groupBy(USER_LIKES_IDEA.IDEA_ID);
返回上下文
.select(DSL.field(“comment\u count”).as(“num\u comments”))
.select(DSL.field(“like\u count”).as(“num\u likes”))
.选择(用户.显示名称)
.选择(用户.权限)
.select(IDEA.fields())
.from(IDEA.leftOuterJoin(numComments).on(COMMENT.IDEA\u ID.eq(IDEA.ID))
.leftOuterJoin(numLikes).on(用户\u喜欢\u IDEA.IDEA\u ID.eq(IDEA.ID))
.leftOuterJoin(USER.on(IDEA.USER\u ID.eq(USER.ID)))
.getQuery();
}
然后根据上下文,使用返回的查询附加附加修饰符(使用addConditions()
,addOrderBy()
,addLimit()
等),然后执行
我遇到的问题是,这两个子选择查询没有被命名为联接的原始名称。这是正确的行为!然而,在jOOQ中,我很难找到如何指定要连接的子查询字段。我已经尝试按照StackOverflow answer中所述的方式重命名子查询,但是类型不适合我
有什么想法吗?所以我找到了我认为目前的解决方案。然而,这似乎是一个解决办法。我在进行连接时给了子查询名称,并使用该名称指向字段。如果我的模式在将来发生更改,我认为这不会导致编译时错误 这是给感兴趣的人的:
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();
}
private SelectQuery getIdeasQuery(){
选择numComments=dslContext.Select(DSL.count().as(“comment\u count”),comment.IDEA\u ID).from(comment.groupBy(comment.IDEA\u ID);
选择numLikes=dslContext.Select(DSL.count().as(“like_count”),USER_LIKES_IDEA.IDEA_ID)。from(USER_LIKES_IDEA.groupBy(USER_LIKES_IDEA.IDEA_ID);
返回上下文
.select(DSL.field(“comment\u count”).as(“num\u comments”))
.select(DSL.field(“like\u count”).as(“num\u likes”))
.选择(用户.显示名称)
.选择(用户.权限)
.select(IDEA.fields())
.from(IDEA.leftOuterJoin(numComments.asTable(“com”)).on(DSL.field(“com.IDEA\u id”).eq(IDEA.id))
.leftOuterJoin(numLikes.asTable(“like”).on(DSL.field(“like.idea_id”).eq(idea.id))
.leftOuterJoin(USER.on(IDEA.USER\u ID.eq(USER.ID)))
.getQuery();
}