<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%';