当前位置: 首页 > 编程笔记 >

解决mybatis where-if中if不能识别大写AND,OR的问题

潘自强
2023-03-14
本文向大家介绍解决mybatis where-if中if不能识别大写AND,OR的问题,包括了解决mybatis where-if中if不能识别大写AND,OR的问题的使用技巧和注意事项,需要的朋友参考一下

mybatis报错:

Caused by: org.apache.ibatis.ognl.ParseException: Encountered " "AND “” at line 1

错误代码:

<select id="selectAccountList" resultMap="BaseResultMap">
  SELECT ct.customer_name customerName,sam.city_code,sam.user_name,sam.account_name
 FROM sys_account_manager sam LEFT JOIN sys_customer ct ON ct.id = sam.customer_id 
  WHERE sam.deleted = 0
  <if test="customerName != null AND customerName != '' ">
  AND ct.customer_name LIKE concat('%',#{customerName},'%')
  </if>
  <if test="cityCode != null AND cityCode != '' ">
  AND LOCATE(#{cityCode},sam.city_code)
  </if>
  order by status,account_validity_time DESC
 </select>

正确代码:

原因是:

if条件中AND为大写,大写不能识别,应改为小写。

<select id="selectAccountList" resultMap="BaseResultMap">
  SELECT ct.customer_name customerName,sam.city_code,sam.user_name,sam.account_name
 FROM sys_account_manager sam LEFT JOIN sys_customer ct ON ct.id = sam.customer_id 
  WHERE sam.deleted = 0
  <if test="customerName != null and customerName != '' ">
  AND ct.customer_name LIKE concat('%',#{customerName},'%')
  </if>
  <if test="cityCode != null and cityCode != '' ">
  AND LOCATE(#{cityCode},sam.city_code)
  </if>
  order by status,account_validity_time DESC
 </select>

补充:Mybatis中if判断遇到的坑

最近在项目开发的过程中,遇到了Mybatis的一个坑(也许是Mybatis有意这样设计的),对于Integer或者Long这种引用数据类型,在做if判断的时候,如果引用数据类型为0,则mybatis将会视为”“空字符串,所以走不进判断逻辑里。

以下余额字段为Long类型,availableAmount值为0时,将走不进判断方法内的示例截图:

解决方法:

在test判断条件中添加”or availableAmount==0“即可,以下是示例截图:

或者在业务场景允许的情况下,只判断availableAmount!=null

<if test="availableAmount!=null">
  ...
</if>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持小牛知识库。如有错误或未考虑完全的地方,望不吝赐教。

 类似资料:
  • 主要内容:1.业务,2.策略模式,3.Map+函数式接口,4.总结1.业务 根据业务去写代码 1.if-else 2.switch 由于 整个 if-else的代码有很多行,也不方便修改,可维护性低。 个方法的代码可就太长了,影响了可读性。 2.策略模式 策略模式是把 if语句里面的逻辑抽出来写成一个类,如果要修改某个逻辑的话,仅修改一个具体的实现类的逻辑即可,可维护性会好不少。 以下是策略模式的具体结构 不过策略模式业务代码还是if-else,不过维护好一点了

  • 问题内容: 我有以下代码: 在哪里。 如果第一个陈述为真会怎样? Java还会检查第二条语句吗?因为为了使第一条语句为真,所以HashMap不应包含给定的键,因此如果选中了第二条语句,则将获得。 简单来说,如果我们有以下代码 Java将在第一种情况下检查b是否a为false,a在第二种情况下是否为true? 问题答案: 不会被评估。这非常有用。例如,如果你需要测试String是否为null或为空,

  • 本文向大家介绍Nginx中IF、AND、OR语句用法实例,包括了Nginx中IF、AND、OR语句用法实例的使用技巧和注意事项,需要的朋友参考一下 在上一篇文章:《Nginx if语句加正则表达式实现字符串截断》中, 我们介绍过了使用if来进行截断字符串的用法, 这次我们来了解下if的逻辑用法: 什么是逻辑用法呢, 就程序中的and、or关系, 就叫做逻辑了. NGINX支持if的 and 与 o

  • 问题内容: 我正在寻找一种缩短此代码并避免重复代码和if语句的方法。我正在做的是创建一个计算器,该计算器在字符串中搜索运算符“ * / +-”并相应地执行它们。有任何想法吗? 另外,是否有解决方案来接受带有两个以上操作数的字符串?即5 + 10 * 2/3 问题答案: 要更改代码,可以使用switch语句,并将一些冗余代码放在开关之前或之后。

  • 和有什么区别? 我在哪里和什么时候可以使用这两种工具?

  • 问题内容: 我想知道为什么要使用一个语句而不是多个语句?例如,这样做之间有什么区别: 还有这个: 他们似乎做的完全一样。 问题答案:

  • 问题内容: 两者之间有什么区别吗? …和… ? 问题答案: 它们是相同的,但是如果您的代码中包含MVC并且不想在代码中产生大量回声,那么第二个方法就很棒。例如,在我的文件(Zend Framework)中,我将编写如下内容:

  • 本文向大家介绍C# if, if...else, if... else if ,包括了C# if, if...else, if... else if 的使用技巧和注意事项,需要的朋友参考一下 示例 该if语句用于控制程序的流程。一条if语句根据Boolean表达式的值标识要运行的语句。 对于单个语句,braces{}是可选的,但建议使用。 该if还可以有一个else条款,将在案件条件的计算结果来执