Есть ли способ проверить значения привязки запросов в jOOQ?

У нас есть проблема с запросами, которые содержат VisitListenerусловия contaIN со многими параметрами привязки, поскольку они имеют много вариантов и быстро переполняют кеш запросов.

Я хочу проверить не в условии условия моего оператора sql и выбросить исключение, если там указано более 30 значений borg.jooq.impl.InCondition # valuesd, указанных в разделе.

Могу ли я использовать для этого?public class MyVisitListener extends DefaultVisitListener { @Override public void visitStart(VisitContext context) { if (context.clause() == Clause.CONDITION_IN || context.clause() == Clause.CONDITION_NOT_IN) { try { Field field = context.queryPart().getClass().getDeclaredField("values"); field.setAccessible(true); Object value = field.get(context.queryPart()); if (((Object[]) value).length > 30) { throw new IllegalArgumentException("More than 30 bind values specified!"); } } catch (NoSuchFieldException | IllegalAccessException e) { //throw new UnknownException("Can`t check size of field 'values' in " + context.queryPart().getClass().getName(), e); } } } }

Я могу использовать условие org.jooq.VisitContext # для поиска inили INусловия, но я не могу проверить VisitListenerразмер без отражения.

Теперь я вынужден сделать что-то вроде этого:

CONDITION_IN

Есть ли более удобный способ (jOOQ 3.10.8 pro)?

java,sql,jooq,

3

Ответов: 2


3 принят

Я пришел сюда, чтобы предложить INпереписку ( как Петр сделал очень хорошо, в своем ответе ). Кроме того, правильным FIELDрешением будет прослушивание CONDITION_INпредложения, помните эту информацию в каком-то стеке, а затем подсчитывайте все FIELDпредложения, которые появляются сразу после этого, до тех пор, пока INпредложение не закончится снова. И имейте в виду, что вместо значения привязки может также быть выражение (снова содержащее несколько предложений) в списке.<settings xmlns="http://www.jooq.org/xsd/jooq-runtime-3.10.8.xsd"> <inListPadding>true</inListPadding> </settings>IN

Ясно, что предложение Петра намного проще.


4

Другой вариант, часто приемлемый обходной путь к вашей проблеме, включает дополнительное дополнение в списке в jOOQ :

IN

Это не совсем то, что вы хотите, но это может быть именно то, что вам нужно. Короче говоря, он заставляет jOOQ генерировать INусловия, которые всегда имеют мощность в 2 раза . Это делает его намного проще в кэше запросов.

Вместо этого (8 запросов):

-- Original
SELECT * FROM AUTHOR WHERE ID IN (?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?, ?, ?, ?, ?)

вы увидите это (4 вопроса и улучшайтесь по мере увеличения длины):

-- Padded
SELECT * FROM AUTHOR WHERE ID IN (?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?, ?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?, ?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?, ?, ?, ?, ?)
SELECT * FROM AUTHOR WHERE ID IN (?, ?, ?, ?, ?, ?, ?, ?)
Java, SQL, jooq,
Похожие вопросы