mybatis报错:Error evaluating expression

本文解决了一个在MyBatis mapper文件中遇到的问题,即if标签内的test属性使用大写AND作为逻辑运算符时导致的错误。通过调整为小写and,成功避免了该语法错误。

mybatis报错:Error evaluating expression ‘stu.id != null AND stu.id != ‘’’. Cause: org

mybatis的mapper文件中报了这么一个错

Error evaluating expression 'id != null AND id != '' '

这个SQL如下:

<select id="xxx" parameterType="yyy" resultType="zz">
 select * from stu
 <where>
  <if test="id != null AND id != '' ">
   and id = #{id}
  </if>
  <!-- ... -->
 </where>
</select>

解决:if标签的test里面的表达式的and不能写成大写AND。(具体的原因本人没有详细探究过,估计是mybatis的语法不允许吧)

在表达式求值过程中遇到 **循环引用错误**(`Expression.Error: cyclic reference encountered`)通常发生在数据建模或公式计算环境中,例如在 Power Query、Excel、Power BI 或类似的表达式语言中,当某个字段或变量的定义依赖于自身时,就会触发此类错误。 ### 错误原因 循环引用错误的根本原因是 **表达式之间的依赖关系形成了闭环**。例如: - 字段 A 的值依赖于字段 B。 - 字段 B 的值又依赖于字段 A。 这种情况下,系统无法确定正确的求值顺序,从而抛出循环引用错误 [^3]。 ### 解决方法 #### 1. **检查字段定义** 在 Power Query 或 Excel 中,逐一检查每个字段的定义,尤其是最近修改过的字段。查找是否存在: - 自引用字段(如 `Column1 = Table.AddColumn(Source, each Column1 + 1)`)。 - 多个字段之间形成的间接依赖链。 #### 2. **使用 `let` 表达式分离逻辑** 在 M 语言(Power Query)中,使用 `let` 表达式可以将复杂逻辑拆分为中间变量,从而避免直接引用自身。例如: ```m let Source = Table.FromRecords({ [A = 10, B = 20] }), AddColumnC = Table.AddColumn(Source, "C", each [A] + [B]), AddColumnD = Table.AddColumn(AddColumnC, "D", each [C] * 2) in AddColumnD ``` 通过中间变量 `AddColumnC` 和 `AddColumnD` 分离计算步骤,避免了字段之间的循环依赖 [^4]。 #### 3. **延迟求值或使用函数封装** 在某些情况下,可以通过将表达式封装为函数来延迟求值,从而打破循环。例如: ```m let GetValue = () => Value, Value = GetValue() + 1 in Value ``` 虽然上述代码仍然存在循环引用问题,但通过函数封装可以改变求值顺序,帮助系统识别依赖路径 [^5]。 #### 4. **重构数据模型** 在 Power BI 或 Excel 数据模型中,避免在 DAX 表达式中使用相互依赖的度量值或列。可以: - 将共享逻辑提取为独立的度量值。 - 使用 `CALCULATE` 和 `FILTER` 明确上下文边界。 - 避免在计算列中直接引用自身。 #### 5. **使用临时表或缓存中间结果** 在复杂计算中,将中间结果缓存到临时表中,再进行后续引用,可以有效避免循环依赖。例如: ```m let Source = ..., TempTable = Table.TransformColumns(Source, {{ "Intermediate", each _ * 2 }}), FinalTable = Table.TransformColumns(TempTable, {{ "Final", each [Intermediate] + 1 }}) in FinalTable ``` 通过引入 `TempTable`,将计算过程拆分为多个阶段,避免了在同一阶段中对字段的循环引用 [^6]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值