Верблюжий sql против вызова собственного компонента для динамического sql (предложение переменных столбцов where)

#apache-camel

#apache-camel

Вопрос:

Использование компонента camel sql кажется хорошей вещью в проекте, использующем camel. Но я не вижу смысла в случаях, когда необходим динамический sql. Пример использования: во внешнем интерфейсе пользователь может

  1. выберите только тип записи и отправьте поиск, в данном случае предложение where : «из таблицы1, где col1 = valueX1»
    1. также выберите диапазон дат для даты начала предложения, чтобы предложение where выглядело как «из table1, где col1 = valueX1 и dateCol между (…)»
    2. и так далее для другого пользовательского интерфейса, если заданы значения в общей сложности 10 разных столбцов в разных комбинациях

Я попытался использовать динамический sql, выяснил три варианта: 1. использование списка получателей, чтобы маршрут выбирался во время выполнения, казалось чрезмерным. 2. использование тела в качестве sql и useMessageBodyForSql= true 3. использование пользовательской стратегии prepareStatementStrategy

Для 2 и 3 я не смог отправить имена параметров или указать заголовки или свойства, которые должны быть частью значений, которые будут использоваться в подготовленном операторе.

Для .2. пришлось задать sql типа: выберите c1, c2 … из t1, где x = ? и y = ?

и затем список утилит Java со значениями по порядку.

Итак, есть ли какое-либо преимущество в использовании этого? Есть ли какая-либо особенность компонента sql, которая делает его более удобным, чем прямое использование шаблона spring jdbc, который он использует?

Комментарии:

1. Эта ссылка может помочь вам передать динамические значения в sql-запрос. kswaughs.com/2016/08/camel-sql-component-example.html

2. Спасибо, но мне нужно создать динамические предложения where. Означает, что столбцы отличаются.

Ответ №1:

Я бы предложил использовать шаблоны Camel, чтобы сделать инструкции такими динамическими:

 to("freemarker://sql/template.ftl")
.log("${body}")
.to("sql:ignored?useMessageBodyForSql=true");
  

Обратите внимание, что параметры запроса представлены символом ? вместо # символа, если оператор исходит из тела:

 -- sql/template.ftl
select count(*) as count
  from a_table
<#if headers.namePattern?has_content>
 where name like :?namePattern
</#if>
  

Вы также можете переключиться на компонент MyBatis, который поддерживает расширенные шаблоны через MyBatis, но это сопряжено с гораздо более высокими накладными расходами с точки зрения кодирования и конфигурации.