2014-10-26 2 views
1

В настоящее время изучая возможности JOOQ, я хочу начать внимательно и использовать JOOQ как SQL-конструктор. Я определил свою схему базы данных как классы, полученные от CustomTable, чтобы получить безопасность типа. Это приводит к коду, какСоздание PreparedStatement из jooq Query

Param<Integer> pId = ... 
Query query = context.select(sometable.somefield.max()) 
        .from(sometable) 
        .where(sometable.id.eq(pId) 
        ; 

где sometable является переменной держит один из моих экземпляров таблицы.

То, что я в настоящее время делаю с query сродни

PreparedStatement pstmt = connection.prepareStatement(query.getSQL()); 
pstmt.setObject(1, pId.getValue(), pId.getDataType().getSQLType()); 

Но как только есть несколько параметров для утверждения, я начинаю замысловатые зависимостей от реализации JOOQ в отношении setObject первого параметра.

Я думал использовать query.getBindValues(), но это возвращает только простые объекты Java для привязки к оператору. Я должен предположить, что порядок соответствует порядку позиции для setObject и, кроме того, я пропущу getSQLType(). Так что это тоже нехорошо.

Тогда я надеялся найти что-то наподобие query.getPreparedStatement(connection), чтобы создать заявление из предоставленного соединения со всеми параметрами, красиво заполненными, но это, похоже, не существует.

Есть ли какой-нибудь опрятный способ получить PreparedStatement из JOOQ Query, которого я не хватает?

+0

Для полноты, не могли бы вы добавить короткое объяснение, почему вы не хотите использовать jOOQ для выполнения вашего запроса? –

+0

Я еще не готов полностью продать свою душу JOOQ :-) Кроме того, я прочитал, что JOOQ начинался как SQL-конструктор, и я думаю, что существует естественное разделение трех обязанностей: 1) получить запрос или утверждение , 2) обработка соединения с db с пулами, соединение, утверждение и т. Д., 3) чтение данных из результатов запроса. Получив PreparedStatement в обмен на соединение и JOOQ Query, можно было бы отлично отделить между (1) и (2). – Harald

+0

Ваша душа может бежать, но она не может скрыться. jOOQ готовит заявления уже 5 лет - используется крупными корпорациями в производстве ... Не уверен, о чем вы беспокоитесь :) С самого начала jOOQ привязывал переменные к PreparedStatement. Функция извлечения SQL появилась только позже.Во всяком случае, я дам ответ –

ответ

1

По умолчанию jOOQ внутренне создает PreparedStatements каждый раз, когда вы запускаете Query.execute() или любой из различных методов ResultQuery.fetch(). Я думаю, что было бы неплохо позволить пользователям подготовить отчет и получить доступ к таким неисполняемым операциям с помощью нового метода Query.statement(). Я добавил это как запрос особенность:

Уже сегодня вы можете извлечь SQL и переменные связывания себя с помощью API вы упомянули, более или менее, как вы (примечание, есть также Query.getParams()), который возвращает Param типов в порядке привязки.

Обратите внимание, что, как правило, на самом деле нет веских причин (кроме кэширования строк SQL в сценариях с очень высокой пропускной способностью) для извлечения строки SQL и ее выполнения непосредственно через JDBC. jOOQ в основном используется для визуализации SQL и для его выполнения.

+0

Спасибо, что приняли это как запрос функции. Если я скажу, я бы предпочел бы «ResultQuery.statement (Connection con)», потому что только это позволяет мне продолжать владеть соединением, а только заимствовать его для JOOQ для создания заявления. – Harald

+0

@Harald: Хотя вы можете предпочесть этот конкретный API для вашего прецедента, это было бы очень удивительно в общем контексте jOOQ API. В любом сопоставимом методе практически нет ссылки на «Connection», поэтому было бы бессмысленно добавлять его туда. В сущности, будет 'ResultQuery.statement()' и, возможно, 'DSLContext.statement (ResultQuery)'. Оба метода будут совместимы с существующим ['ResultQuery.keepStatement()') (http://www.jooq.org/javadoc/latest/org/jooq/ResultQuery.html#keepStatement-boolean-). Я надеюсь в этом есть смысл? –

+0

Я не уверен, что вызов метода должен быть добавлен, потому что что бы я сделал с этим утверждением? Это происходит из-за связи, которой я действительно не владею в месте вызова, и я задаюсь вопросом, разумно ли тогда делать что-либо с этим утверждением. Но я признаю, что я еще недостаточно глубоко разбираюсь в JDBC. – Harald

Смежные вопросы