检查 属性 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,看来)。