ibatis-在where中混合動態和靜態sql

ibatis sql mapping 中原始的sql是這樣的。

<select id="searchUsers" parameterClass="User" resultClass="User">
select * from user_profile
<dynamic prepend="where">
<isGreaterThan prepend="AND" property="roleId" compareValue="0">
roleId=#roleId#
</isGreaterThan>
<isNotEmpty prepend="AND" property="loginName">
loginName like '%$loginName$%'
</isNotEmpty>
</dynamic>
</select>

現在我需要增加一個靜態的過濾條件 loginName != 'anonymous',如何能夠混合動態和靜態sql在where子句中呢。
第一種方案:

<select id="searchUsers" parameterClass="User" resultClass="User">
select * from user_profile
<dynamic prepend="where">
loginName != 'anonymous'
<isGreaterThan prepend="AND" property="roleId" compareValue="0">
roleId=#roleId#
</isGreaterThan>
<isNotEmpty prepend="AND" property="loginName">
loginName like '%$loginName$%'
</isNotEmpty>
</dynamic>
</select>

這樣配置產生的結果是 roleId條件前沒有AND

select * from user_profile where loginName != 'anonymous' roleId=1 AND loginName like '%user%';


第二種方案:

<select id="searchUsers" parameterClass="User" resultClass="User">
select * from user_profile where loginName != 'anonymous'
<dynamic>
<isGreaterThan prepend="AND" property="roleId" compareValue="0">
roleId=#roleId#
</isGreaterThan>
<isNotEmpty prepend="AND" property="loginName">
loginName like '%$loginName$%'
</isNotEmpty>
</dynamic>
</select>

這種方案解決了動態和靜態sql的混合問題,產生的sql無論有沒有roleid和loginName參數都是正確的。

select * from user_profile where loginName != 'anonymous';
or

select * from user_profile where loginName != 'anonymous' AND roleId=1 AND loginName like '%user%';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章