检查 属性 MyBatis 中是否存在包含片段
Checking property existence of include fragment in MyBatis
有什么方法可以检查包含片段中的 属性 是否已设置?
示例:
<include refid="myFilterLocation">
<property name="model" value="model_name"/>
...
...
...
</include>
然后当这个片段被使用时:
<if test="....">
AND ${model}= #{${param}.model,jdbcType=VARCHAR}
</if>
有什么方法可以测试 属性 是否未发送?。如果我不想在我的查询中进行过滤,我不想发送属性。
亲切的问候。
您可以使用以下方法检查参数是否为空:
<if test="param != null">
...
</if>
当属性没有定义时,${model}
根本就不会被替换,所以你可以这样写条件
<if test='"${model}" != "${model}"'>
AND ${model}= #{${param}.model,jdbcType=VARCHAR}
</if>
请注意 single/double 引号和第二个美元符号前的反斜杠的不寻常用法。
(更长的解释)
test
属性值中有两个变量 ${model}
,但是第二个变量 escaped 使用前导反斜杠。
因此,当指定 'model' 属性 时,包含的 if 元素将如下所示。
<if test='"model_name" != "${model}"'>
条件是简单的两个字符串比较,结果是true
。
请注意,用于转义变量的反斜杠已被删除(这就是 MyBatis 变量转义的工作原理)。
现在,当 'model' 属性 未指定时,变量未被替换,因此包含后的 if 元素如下所示。
<if test='"${model}" != "${model}"'>
可以看到,两个字符串是一样的,条件的结果是false
.
并且 OGNL 要求字符串文字使用双引号。
如果使用单引号,可能会抛出 NumberFormatException
(OGNL 将其识别为 char
,看来)。
有什么方法可以检查包含片段中的 属性 是否已设置? 示例:
<include refid="myFilterLocation">
<property name="model" value="model_name"/>
...
...
...
</include>
然后当这个片段被使用时:
<if test="....">
AND ${model}= #{${param}.model,jdbcType=VARCHAR}
</if>
有什么方法可以测试 属性 是否未发送?。如果我不想在我的查询中进行过滤,我不想发送属性。
亲切的问候。
您可以使用以下方法检查参数是否为空:
<if test="param != null">
...
</if>
当属性没有定义时,${model}
根本就不会被替换,所以你可以这样写条件
<if test='"${model}" != "${model}"'>
AND ${model}= #{${param}.model,jdbcType=VARCHAR}
</if>
请注意 single/double 引号和第二个美元符号前的反斜杠的不寻常用法。
(更长的解释)
test
属性值中有两个变量 ${model}
,但是第二个变量 escaped 使用前导反斜杠。
因此,当指定 'model' 属性 时,包含的 if 元素将如下所示。
<if test='"model_name" != "${model}"'>
条件是简单的两个字符串比较,结果是true
。
请注意,用于转义变量的反斜杠已被删除(这就是 MyBatis 变量转义的工作原理)。
现在,当 'model' 属性 未指定时,变量未被替换,因此包含后的 if 元素如下所示。
<if test='"${model}" != "${model}"'>
可以看到,两个字符串是一样的,条件的结果是false
.
并且 OGNL 要求字符串文字使用双引号。
如果使用单引号,可能会抛出 NumberFormatException
(OGNL 将其识别为 char
,看来)。