Mybatis If statements using include properties

jamesnuge picture jamesnuge · Feb 8, 2016 · Viewed 8.1k times · Source

I'm trying to create a generic SQL include in Mybatis that will apply a comparator given a particular value. The idea is to reuse this sql code snippet across several mappers. The issue I'm having is when using string substitution in the if statement inside of my include.

Currently the xml looks like this:

<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>

When using the ${comparator} inside of the test the OGNL expression is evaluated before the string substitution occures causing a ParseException because $ is not a valid first character.

Is there a way to reference a property of an sql snippet inside of an OGNL expression?

Answer

Ballsigno picture Ballsigno · Aug 2, 2018

Haha, I have the same problem now, but I found out the way.
That is to use bind. I know I no longer can't call property in that way.

<bind name="isGetList" value='"1"' />
<include refid="conditionSql" />

<sql id="conditionSql">
    <if test='isGetList == "1"'>
        for example.
    </if>
</sql>