アンドレイDerevianko:
我々は含むクエリに問題持ってIN
、彼らは多くのバリエーションがあり、すぐにクエリキャッシュをオーバーフローするので、多くのバインドのparamsとの条件を。
私はそこに30の以上のバインド値が句でのために指定されていれば、私のSQL文の条件節にチェックして、例外をスローします。
私は使用することはできVisitListener
ていますか?
私は見つけることorg.jooq.VisitContext#句を使用することができるin
かnot in
の条件が、私は確認することができないorg.jooq.impl.InCondition#values
反射せずにサイズを。
今、私はこのような何かをすることを強制しています:
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);
}
}
}
}
もっと便利な方法(jOOQ 3.10.8プロ)はありますか?
ルーカス・エダー:
私が提案するためにここに来ましたIN
(リストのパディングをペトルが彼の答えに、非常にうまく行ったように)。それ以外は、適切なVisitListener
解決策をに耳を傾けるだろうCONDITION_IN
、句スタックのいくつかの並べ替えにその情報を覚えているし、すべてカウントFIELD
されるまで、その後すぐに来る節をCONDITION_IN
句が再び終了します。代わりに、バインド値の、また、(再びいくつか含む式があるかもしれないことを心に留めておくFIELD
における条項)をIN
リスト。
明らかに、ペトルの提案があるずっと容易になります。