jOOQでクエリバインド値を確認する方法はありますか?

アンドレイDerevianko:

我々は含むクエリに問題持ってIN、彼らは多くのバリエーションがあり、すぐにクエリキャッシュをオーバーフローするので、多くのバインドのparamsとの条件を。

私はそこに30の以上のバインド値が句でのために指定されていれば、私のSQL文の条件節にチェックして、例外をスローします。

私は使用することはできVisitListenerていますか?

私は見つけることorg.jooq.VisitContext#句を使用することができるinnot 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リスト。

明らかに、ペトルの提案があるずっと容易になります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=200292&siteId=1