Как я могу повторно использовать / составлять часть запроса JOOQ в методе репозитория?

С переменной JOOQ DSLContext ctx меня есть метод для выбора всех данных отношений.

  open fun selectAllSomethings(id: String): List<SomeDto> = ctx .select(..), .from(..) .join(..) .leftJoin(...) .fetch() .map() 

И мне нужно повторно использовать эту логику с помощью метода add где для конкретного id я хочу изменить код для использования fetchOne и map . Как я могу повторно использовать первую часть запроса и поделиться им между обоими методами? Эта часть:

 ctx.select(..), .from(..) .join(..) .leftJoin(...) 

Нужно ли делить это на два разных метода? Или нужно добавить if ?

Этот ответ не является синтаксически совершенным – без создания вашей сгенерированной модели и не зная полных типов, я могу показать только грубую выборку. Решение в основном было бы общим методом, используемым двумя другими способами:

 private fun DSLContext.baseThingQuery(id: String): ResultQuery<Record> { return select(...) .from(...) .join(...).on(...) .leftJoin(...).on(...) } fun fetchAllThings(id: String): List<ThingDto> { return ctx.baseThingQuery(id).fetch(...).map(...) } fun doSomethignWithOneThing(id: String): ThingDto { return ctx.baseThingQuery(id).fetchOne(...).map(...) } 

Примечание. Я сделал функцию общей утилиты расширением DSLContext только для того, чтобы было более очевидно, что она предназначена для использования только в контексте (т. Е. Транзакции), а также для private чтобы сделать ее действительно внутренней. Вы можете легко изменить это, чтобы передать в контексте в качестве параметра.