【发布时间】:2016-05-17 17:12:27
【问题描述】:
我正在尝试在 Mybatis 中创建一个通用 SQL 包含,它将应用给定特定值的比较器。这个想法是在多个映射器中重用这个 sql 代码 sn-p。我遇到的问题是在我的 include 内的 if 语句中使用字符串替换时。
目前xml看起来是这样的:
<select id="get" parameterType="ServiceModelQueryHelper" resultMap="ServiceRecordMap">
SELECT * from service
<if test="name.isApplicable()">
WHERE service.name
<include refid=comparatorMapper>
<property name="comparator" value="${name.comparator}"/>
<property name="value" value="${name.value}"/>
</include>
</if>
</select>
<sql id="comparatorMapper">
<if test="${comparator} == 'EQUALS'">
= ${value}
</if>
<if test="${comparator} == 'CONTAINS'">
~ ${value}
</if>
</sql>
在测试中使用 ${comparator} 时,OGNL 表达式在字符串替换发生之前进行评估,导致 ParseException,因为 $ 不是有效的第一个字符。
有没有办法在 OGNL 表达式中引用 sql sn-p 的属性?
【问题讨论】:
-
我认为您应该使用参数标记#{comparator} 而不是字符串替换。
-
我尝试使用 #{comparator} 但这使得 mybatis 在父查询中的 ServiceModelQueryHelper 上查找比较器字段,而不是在传递给 include 语句的对象上
标签: java postgresql mybatis dynamic-sql ognl