1

有没有办法检查包含片段中的属性是否已设置?例子:

<include refid="myFilterLocation">
  <property name="model" value="model_name"/>
  ...
  ...
  ...
</include>

然后当使用这个片段时:

<if test="....">
 AND ${model}= #{${param}.model,jdbcType=VARCHAR}
</if>

有没有办法测试属性是否没有发送?如果我不想在我的查询中过滤,我不想发送属性。

亲切的问候。

4

2 回答 2

1

当属性未定义时,${model}根本不会被替换,因此您可以将条件编写如下。

<if test='"${model}" != "\${model}"'>
  AND ${model}= #{${param}.model,jdbcType=VARCHAR}
</if>

请注意单引号/双引号和第二个美元符号之前的反斜杠的不寻常用法。

(更长的解释)

${model}属性值中有两个变量test,但是第二个变量使用前导反斜杠进行转义
因此,当指定 'model' 属性时,包含的 if 元素将如下所示。

<if test='"model_name" != "${model}"'>

条件是简单的两个字符串比较,结果是true.
请注意,用于转义变量的反斜杠已被删除(这就是 MyBatis 的变量转义工作方式)。

现在,当没有指定 'model' 属性时,变量不会被替换,所以 if 元素在包含后如下所示。

<if test='"${model}" != "${model}"'>

如您所见,两个字符串相同,条件的结果为false

OGNL 要求字符串文字使用双引号。
如果您使用单引号,NumberFormatException可能会被抛出(OGNL 将其识别为char,似乎)。

于 2020-05-30T16:56:42.930 回答
0

您可以使用以下方法检查参数是否不为空:

<if test="param != null">
  ...
</if>
于 2020-05-21T15:53:45.490 回答