Mybatis中如何处理WHERE-IF语句中大写AND、OR不被识别的问题?

2026-04-19 19:191阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计468个文字,预计阅读时间需要2分钟。

Mybatis中如何处理WHERE-IF语句中大写AND、OR不被识别的问题?

MyBatis 报错:解析异常,原因:org.apache.ibatis.ognl.ParseException:遇到非法字符+AND在行1,错误代码:select id=selectAccountList resultMap=BaseResultMap SELECT ct.customer_name AS customerName, sam.city_code, sam.user_name,

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“即可,以下是示例截图:

Mybatis中如何处理WHERE-IF语句中大写AND、OR不被识别的问题?

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

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

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

本文共计468个文字,预计阅读时间需要2分钟。

Mybatis中如何处理WHERE-IF语句中大写AND、OR不被识别的问题?

MyBatis 报错:解析异常,原因:org.apache.ibatis.ognl.ParseException:遇到非法字符+AND在行1,错误代码:select id=selectAccountList resultMap=BaseResultMap SELECT ct.customer_name AS customerName, sam.city_code, sam.user_name,

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“即可,以下是示例截图:

Mybatis中如何处理WHERE-IF语句中大写AND、OR不被识别的问题?

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

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

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