Take a look at the following union sql fragment. What if includeFoo is false?
<sql id="dynamic_union"> <if test="includeFoo"> (select * from foo) </if> <if test="includeBar"> union all (select * from bar) </if> </sql>
You will end up with
union all (select * from bar)
, which is not legal sql. There must be a result set before “union all”
The solution is to use <trim/> tag
<sql id="dynamic_union"> <trim prefixOverrides="union all"> <if test="includeFoo"> (select * from foo) </if> <if test="includeBar"> union all (select * from bar) </if> </trim> </sql>
It means: if what’s inside <trim/> starts with “union all”, then “union all” will be removed