1

クエリパラメーターではなく、mybatis 構成からのパラメーターに基づいて、条件付きクエリフラグメントを作成しようとしています。このようなもの:

<sql id="frag">
    <if test="col_name != null">
        SELECT * FROM TABLE WHERE ${col.name}=#{value}
    </if>
    <if test="col_name == null">
        SELECT * FROM TABLE WHERE SAMPLECOL=#{value}
    </if>
</sql>

ここで、の値はcol_name、mybatis 構成によって読み取られる .properties ファイル内で指定されるグローバル パラメーターです。

どうやらこれは機能しません。ソースコードを見ると、OGNL式エバリュエーターは構成プロパティを認識していないようです(代わりに${...}、SQL内でパラメーター置換がある場合に機能しています)。誰かがこれを行う方法を見つけましたか?

4

1 に答える 1

1

これは現在不可能であることがわかりました。OGNL は事実上、構成プロパティにアクセスできません。

回避策として、mybatis メーリング リストのこの投稿で提案されているように、構成パラメーターを読み取ってクエリ パラメーター マップに追加する単純なインターセプターを作成しました。正確にはきれいではありませんが、機能します。

インターセプター コード:

@Intercepts({
    @Signature(type = Executor.class,
    method = "query",
    args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})
public class ConfigPropInterceptor implements Interceptor {

    private final Map<String, Object> properties = new HashMap<String, Object>();

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object param = invocation.getArgs()[1];
        if (param instanceof Map) {
            ((Map<String, Object>)param).putAll(properties);
        }
        return invocation.proceed();
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        for (String p : properties.stringPropertyNames()) {
            this.properties.put(p, properties.getProperty(p));
        }
    }
}

構成 .xml での使用例:

<plugins>
    <plugin interceptor="...ConfigPropInterceptor">
        <property name="_issuerLocation" value="${issuer.location}"/>
    </plugin>
</plugins>

この設定により、_issuerLocation他のすべてと同様に OGNL 式で変数をテストできました。

于 2012-08-16T12:26:40.650 に答える