Недавно я переносил свою базу данных и переносил оставшиеся 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()
запрос затем используется для добавления дополнительных модификаторов (с использованием addConditions()
, addOrderBy()
, addLimit()
и т.д.) В зависимости от контекста, а затем выполняется.
Проблема, с которой я сталкиваюсь, заключается в том, что два запроса суб-выбора не называются их исходными именами для объединений. Это правильное поведение! Однако в jOOQ мне сложно найти, как я могу указать поля подзапроса для присоединения. Я попытался спуститься по маршруту переименования подзапросов, как описано в этом ответе StackOverflow, но типы не подходят для меня.
Есть идеи?
Поэтому я нашел то, что, на мой взгляд, сейчас является решением. Однако это похоже на обходной путь. Я дал имена подзапросов, когда я делаю это соединение, и используя это имя, чтобы указать на это поле. Если моя схема изменится в будущем, я не думаю, что это приведет к ошибке времени компиляции.
Здесь это для всех, кто интересуется:
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();
}