NOOP, где в JOOQ - PullRequest
       17

NOOP, где в JOOQ

3 голосов
/ 08 июля 2019

Я предоставляю метод, который позволяет использовать несколько параметров фильтрации при запросе к таблице 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, которая не считается устаревшей.

1 Ответ

4 голосов
/ 08 июля 2019

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

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

...