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




Вместо where(true) попробуйте where(trueCondition()) (trueCondition() — это статический метод DSL).
Обратите внимание, что where(trueCondition()) предполагает, что вы добавите дополнительные предикаты к вашему allBookQuery, используя and(Condition), и, конечно, было бы неправильно, если бы вы использовали or(Condition). Таким образом, чтобы быть независимым от этого, даже лучше использовать where(noCondition()), для которого не отображается SQL.
Может быть, вы могли бы использовать подход «динамического SQL» jOOQ (jooq.org/doc/latest/manual/sql-building/dynamic-sql)?