Ищите способ создания динамического SQL из заданного SQL-запроса в Java - PullRequest
5 голосов
/ 21 мая 2011

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

SELECT * FROM USER WHERE USERID = 10
. Недостатком этого подхода является то, что база данных компилирует запрос при каждом запуске. Есть ли способ, которым я могу создать динамический запрос SQL из запроса программно. Java или Hibernate, такие как JPA, поддерживают такую ​​функцию?

Ответы [ 4 ]

1 голос
/ 08 августа 2011

Я использовал MyBatis в проекте, чтобы получить очень похожее поведение.Посмотрите также Руководство пользователя для получения полной информации.

В MyBatis вы можете определять запросы с помощью динамического SQL;вы можете передать SqlMapClient объект, содержащий свойства (например, POJO или карту), и использовать их в тексте запроса в виде:

  • # параметров # (например,? в PreparedStatements)
  • $ переменных $, которые стали непосредственно частями строки SQL
  • Функция динамического SQL для включения частей SQL на основе значений свойств

Тогда ваш преобразователь SQL выполнит запрос и возвратитJava-объект: если ваша запись, возвращаемая из запроса, известна, вы можете сопоставить столбцы с POJO;в противном случае в MyBatis вы можете иметь HashMap в качестве результирующего класса и, в конце концов, обрабатывать каждую запись с помощью обработчика с помощью метода queryWithRowHandler () SqlMapClient для пост-обработки возвращаемых данных.

Как только у вас есть хотя бы HashMapпредставление вашего запроса вы можете легко преобразовать его в XML.

1 голос
/ 03 июля 2011

Я согласен с пользователем kuriouscoder, что вы должны использовать переменные связывания. Это работает с простым JDBC. Большинство СУБД имеют кеш курсора, в котором хранятся как проанализированные версии запроса, так и планы выполнения в памяти, если запросы идентичны (т. Е. Нет встроенных переменных). Таким образом, накладные расходы синтаксического анализатора будут минимальными.

Что касается вывода XML, я могу порекомендовать jOOQ (разработчиком которого я являюсь). В следующей версии 1.6.2 я добавлю функции экспорта для различных форматов (XML, HTML, JSON, CSV). Ваш запрос будет построен с использованием свободно распространяемого API jOOQ и будет выглядеть так:

String xml = create.selectFrom(USER)
                   .where(USERID.equal(10))
                   .fetch()
                   .formatXML();

Вывод будет выглядеть следующим образом (и может быть преобразован в XSL в любой другой формат):

<result>
  <fields>
    <field name="USERID"/>
    <field name="FIRSTNAME"/>
    <field name="LASTNAME"/>
    ...
  </fields>
  <records>
    <record>
      <value field="USERID">1</value>
      <value field="FIRSTNAME">Lukas</value>
      <value field="LASTNAME">Eder</value>
      ...
    </record>
    ...
  </records>
</result>

Подробнее см. http://www.jooq.org

0 голосов
/ 24 июля 2011

если я понимаю, о чем вы спрашиваете, тогда вам стоит взглянуть на empiredb http://incubator.apache.org/empire-db/ - это довольно маленький проект, но, по крайней мере, когда я его использовал, его активно и услужливо поддерживали. это похоже на sqlalchemy в Python, поскольку позволяет создавать SQL-запросы с использованием классов и функций в языке.

цитирование по ссылке:

API, безопасный для типов, без строк и интуитивно понятный. Создайте любой оператор SQL, включая предложение select, и используйте его с любым POJO, а не только с полнофункциональными объектными компонентами.

0 голосов
/ 21 мая 2011

Как правило, вам необходимо параметризовать ваш ввод в шаблон запроса, используя переменные связывания.Существует две формы переменных связывания, а именно: i) неназванные переменные связывания (или позиционные переменные связывания);и ii) именованные переменные связывания.

Это можно сделать через ванильный JDBC.Я обнаружил, что Spring JDBC особенно легко маневрировать.В частности, посмотрите на интерфейс JDBCTemplate и его реализации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...