Выбор полей для объединения при объединении вложенных запросов

1

Недавно я переносил свою базу данных и переносил оставшиеся 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, но типы не подходят для меня.

Есть идеи?

Теги:
jooq

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню