我正在尝试根据来自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中的${...}
进行参数替换时,它会正常工作)。有没有人找到办法做到这一点?
答案 0 :(得分:1)
我发现这目前不可能; OGNL实际上无法访问配置属性。
作为一种解决方法,正如my this post在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>
使用此设置,我能够像其他所有内容一样在OGNL表达式中测试_issuerLocation
变量。