NOOP где в JOOQ

Я предоставляю метод, который позволяет использовать несколько параметров фильтрации при запросе к таблице books. Первая часть запроса выполняет поиск либо по всем книгам, либо только по тем, которые принадлежат текущему пользователю.

 val allBookQuery = if (searchParameters.isOnShelf == true) {
    val context = environment.getContext<AuthorizedContext>()
    context?.currentUser ?: throw GraphQLException("No Current User Authenticated")
    val userUUID = UUID.fromString(context.currentUser.uuid)

    select.from(BOOKS, USER_BOOKS, USERS)
    .where(USERS.UUID.eq(userUUID))
    .and(USERS.ID.eq(USER_BOOKS.USER_ID))
    .and(USER_BOOKS.BOOK_ID.eq(BOOKS.ID))
    .and(BOOKS.IS_ARCHIVED.eq(false))
} else {
    select.from(BOOKS).where(true)
}

Выражение .where(true) используется для сохранения согласованности типа allBookQuery, чтобы позже я мог добавлять другие условия без проверки типов.

val filteredBooksQuery = if (searchParameters.bookIds != null) {
    allBookQuery.and(BOOKS.ID.`in`(searchParameters.bookIds))
} else {
    allBookQuery
}

val finalQuery = if (searchParameters.isAcademic == true) {
    filteredBooksQuery.and(BOOKS.IS_ACADEMIC.eq((true)))
} else {
    filteredBooksQuery
}

К сожалению, метод where(Boolean) устарел. Итак, пока это работает, я хотел бы заменить это операцией NOOP, которая не устарела.

Может быть, вы могли бы использовать подход «динамического SQL» jOOQ (jooq.org/doc/latest/manual/sql-building/dynamic-sql)?

sp00m 08.07.2019 18:38

Я буду рассматривать это как долгосрочный рефакторинг.

rharriso 08.07.2019 23:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
2
207
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо where(true) попробуйте where(trueCondition()) (trueCondition() — это статический метод DSL).

Обратите внимание, что where(trueCondition()) предполагает, что вы добавите дополнительные предикаты к вашему allBookQuery, используя and(Condition), и, конечно, было бы неправильно, если бы вы использовали or(Condition). Таким образом, чтобы быть независимым от этого, даже лучше использовать where(noCondition()), для которого не отображается SQL.

Другие вопросы по теме