我现在有这个:
<select id="associations-short-sql" resultMap="associationInfoForListMap">
<![CDATA[
select
a.id as d,
a.name as name,
a.somenum as number
from
associations a
]]>
<if test="id!= null">
where a.id = #{id}
</if>
</select>
但我需要添加过滤功能。因此,如果uri查询具有参数名称,我想要像查询一样添加条件。 id和name都必须是可选的。因此,如果没有在url查询中设置params,那么查询必须是:
select
a.id as d,
a.name as name
a.somenum as number
from
associations a
如果设置了id,则查询必须为:
select
a.id as d,
a.name as name
a.somenum as number
from
associations a
where a.id = #{id}
如果设置了名称,则查询必须为
select
a.id as d,
a.name as name
a.somenum as number
from
associations a
where a.name like '%#{name}%'
如果名称和数字集查询必须是:
select
a.id as d,
a.name as name
a.somenum as number
from
associations a
where a.name like '%#{name}%' and number like '%#{number}%'
但是,当设置一些参数时,我必须保持选择语句顺序正确(我的意思是where
和and
部分)。这是一个相当简单的例子,但它可能要复杂得多。对于参数name
,我应该检查是否设置了number
,参数号I应该检查是否设置了name
。对于id,我应该检查是否设置了名称和号码。如果我有10个参数%!@#!@怎么办? :)
是否可以在某些临时变量中存储where
条件?保持正确的订单会容易得多。谢谢。
答案 0 :(得分:2)
至少有两种选择。
第一个选项是使用dynamic sql,并且适用于许多情况是内置的,并且不需要其他配置:
<select id="associations-short-sql" resultMap="associationInfoForListMap">
<![CDATA[
select
a.id as d,
a.name as name,
a.somenum as number
from
associations a
]]>
<where>
<if test="id != null">
a.id = #{id}
</if>
<if test="id == null">
<if test="name != null">
AND a.name = #{name}
</if>
<if test="number != null">
AND a.number = #{number}
</if>
</if>
</where>
</select>
当<where>
子句为空并且不将其插入结果sql时, where
元素处理大小写。如果您仅通过name
,它还会在开头修剪额外的AND。
另一种选择是使用scripting。 velocity engine中的脚本更具表现力和强大功能。通常表示法更紧凑。 您的示例可能如下所示:
<select id="associations-short-sql" resultMap="associationInfoForListMap">
<![CDATA[
select
a.id as d,
a.name as name,
a.somenum as number
from
associations a
]]>
#where()
#if($_parameter.id)
a.id = @{id}
#else
#if($_parameter.name)
AND a.name = @{name}
#end
#if($_parameter.number)
AND a.number = @{number}
#end
#end
#end
</select>
此外,速度允许您拥有变量,循环等。