#java #jooq
#java #jooq
Вопрос:
Я создаю запрос с помощью jooq и мне нужно добавить условие в предложение where, используя oracle text .. На данный момент у меня есть набор условий, которые я создаю и использую для построения запроса в конце…
List<Condition> conditions = new ArrayList<Condition>();
if(null != searchCriteria.getId()) {
conditions.add(field("id").eq(searchCriteria.getId()));
} else if(null != searchCriteria.getSurname()) {
//add contains condition here. e.g. "CONTAINS (SURNAME, 'POTTER', 1) > 0
}
Я не вижу, как создать это условие или, по крайней мере, вручную создать эту строку SQL, а затем добавить в качестве условия, чтобы затем сгенерировать полный запрос, подобный…
org.jooq.Query ps = select(field("ID")).from(table("PERSON per").where(conditions);
Ответ №1:
Вы уже использовали функцию простого SQL templating в других частях запроса, возможно, непреднамеренно. Теперь вы можете использовать его для создания синтаксических расширений конкретного поставщика непосредственно в jOOQ. Например:
static Condition contains(Field<String> field, String search, int label) {
return condition("contains({0}, {1}, {2}) > 0", field, val(search), inline(label));
}
В приведенном выше примере я использую DSL.condition(String, Object...)
Комментарии:
1. Приветствую этот ответ @Lukas Eder, единственное, что я обнаружил, это то, что мне не удалось установить переменную привязки для значения метки оценки. Я получаю ORA-29909: метка для вспомогательного оператора не является буквенным числом. Мне пришлось жестко закодировать это значение, чтобы оно работало, кто-нибудь знает, как обойти.
2. Извините, что продолжаю спрашивать, но как бы я мог динамически создавать предложение from с помощью объединения таблиц, как это возможно с помощью предложения where .. или я должен задать другой вопрос? У меня есть поисковый запрос, который создается динамически, и если параметр поиска существует, мне нужно добавить объединение таблиц .. но я хотел бы создать список соединений, которые будут добавлены в запрос в конце.
3. @jonesy: Пожалуйста, задайте новый вопрос