Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mybatis If statements using include properties

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?

like image 526
jamesnuge Avatar asked Feb 08 '16 05:02

jamesnuge


1 Answers

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>
like image 156
Ballsigno Avatar answered Oct 19 '22 22:10

Ballsigno