mybatis注解方式if标签报错元素内容必须由格式正确的字符数据或标记组成

在使用mybatis的注解方式的时候出现个问题,我需要一个复杂的sql语句,既有if判断又有in语句,刚开始使用mybatis自己的if动态函数的时候完全没问题,代码如下:

@Select({"select * ","from order_info ","where if (#{staffId} is not null,staffId=#{staffId},1=1) " ,"and if (#{storeId} is not null,storeId=#{storeId},1=1) ","and if (#{start} is not null,dbctime>=#{start},1=1) ","and if (#{end} is not null,dbctime<=#{end},1=1) ","and if (#{status} is not null,status=#{status},1=1) ","and orderId > #{lastMaxIndex} order by orderId asc ","limit #{size}"})List<OrderInfoPO> getOrderInfoList(@Param("staffId") Long staffId, @Param("storeId") Long shopId, @Param("start") Date start, @Param("end") Date end,@Param("status") Integer status, @Param("size") int size, @Param("lastMaxIndex") Long lastMaxIndex);

但是后来要改成in条件,而mybatis的in语句总是出问题,就需要用到

<script>

标签来做,第一次写的代码如下:

@Select({"<script>","select * ","from order_info ","where 1 = 1 ","<if test='staffId != null'>and staffId=#{staffId}</if> " ,"<if test='storeIds != null and storeIds.size() > 0'>and storeId IN ","<foreach item='storeId' collection='storeIds' open='(' separator=',' close=')'>","#{storeId}","</foreach></if> ","<if test='start != null'>and dbctime>=#{start}</if> ","<if test='end != null'>and dbctime<=#{end}</if> ","<if test='status != null'>and status=#{status}</if>","and orderId > #{lastMaxIndex} order by orderId asc ","limit #{size}","</script>"
})
List<OrderInfoPO> getOrderInfoList(@Param("staffId") Long staffId, @Param("storeIds") List<Long> storeIds, @Param("start") Date start, @Param("end") Date end,@Param("status") Integer status, @Param("size") int size, @Param("lastMaxIndex") Long lastMaxIndex);

然后就报错


Caused by: org.apache.ibatis.builder.BuilderException: Error creating document instance.  Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 373; 元素内容必须由格式正确的字符数据或标记组成。at org.apache.ibatis.parsing.XPathParser.createDocument(XPathParser.java:259)at org.apache.ibatis.parsing.XPathParser.<init>(XPathParser.java:115)at org.apache.ibatis.scripting.xmltags.XMLLanguageDriver.createSqlSource(XMLLanguageDriver.java:51)at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.buildSqlSourceFromStrings(MapperAnnotationBuilder.java:482)at org.apache.ibatis.builder.annotation.MapperAnnotationBuilder.getSqlSourceFromAnnotations(MapperAnnotationBuilder.java:465)... 62 more

我一直以为是if标签和foreach标签混用的问题,而且我其他地方用了foreach标签是正常的,这个地方不应该有问题,
最后排查了半天是使用了标签之后,><这些符号需要进行转义,加上<![CDATA[]]>就可以了,改成如下:

@Select({"<script>","select * ","from order_info ","where 1 = 1 ","<if test='staffId != null'>and staffId=#{staffId}</if> " ,"<if test='storeIds != null and storeIds.size() > 0'>and storeId IN ","<foreach item='storeId' index='index' collection='storeIds' open='(' separator=',' close=')'>","#{storeId}","</foreach></if> ","<if test='start != null'>and dbctime<![CDATA[>=]]>#{start}</if> ","<if test='end != null'>and dbctime<![CDATA[<=]]>#{end}</if> ","<if test='status != null'>and status=#{status}</if>","</script>"})List<OrderInfoPO> getOrderInfoList(@Param("staffId") Long staffId, @Param("storeIds") List<Long> storeIds, @Param("start") Date start, @Param("end") Date end,@Param("status") Integer status, @Param("size") int size, @Param("lastMaxIndex") Long lastMaxIndex);

就可以了!!!!!!!!查了一下午才发现,气死我了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/775219.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用python脚本,根据词条爬取百度图片(爬虫)

把广角&#xff0c;换成你的关键词就行 # -*- coding: utf-8 -*- """ Created on Wed Mar 29 10:17:50 2023 author: MatpyMaster """ import requests import os import redef get_images_from_baidu(keyword, page_num, save_dir):header {Us…

Hadoop+Spark大数据技术 第三次作业

第三次作业 1.简述HDFS Shell三种操作命令hadoop fs、hadoop dfs、hdfs dfs的异同点。 相同点 用于与 Hadoop 分布式文件系统&#xff08;HDFS&#xff09;交互。可以执行各种文件系统操作&#xff0c;如文件复制、删除、移动等。 不同点 hadoop fs、hadoop dfs已弃用&#xf…

使用vue构建一个简单实用的春节红包插件!

摘要&#xff1a;本文将介绍如何使用Vue.js构建一个简单实用的春节红包插件。该插件通过模拟红包的打开和关闭过程&#xff0c;以及金额的随机分配&#xff0c;为春节红包活动提供了一个有趣且互动的体验。 一、引言 在春节这个充满欢乐和祝福的时刻&#xff0c;红包成为了传递…

Encoding类

Encoding System.Text.Encoding 是 C# 中用于处理字符编码和字符串与字节之间转换的类。它提供了各种静态方法和属性&#xff0c;**用于在不同字符编码之间进行转换&#xff0c;**以及将字符串转换为字节数组或反之。 在处理多语言文本、文件、网络通信以及其他字符数据的场景…

node.js项目初始化操作

项目环境Vscode 1.新建一个文件夹node.js(xx.js) 2.右键点击node.js&#xff0c;点击打开终端 我在VScode打开终端 输入npm init初始化项目没反应。 解决方法&#xff1a;进入文件夹node.js&#xff0c;出入cmd跳转到终端 重新输入npm init命令 正确结果如下图 后续命令按下…

【Leetcode】2580. 统计将重叠区间合并成组的方案数

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 给你一个二维整数数组 ranges &#xff0c;其中 ranges[i] [starti, endi] 表示 starti 到 endi 之间&#xff08;包括二者&#xff09;的所有整数都包含在第 i 个区间中。 你需要…

Tunes不能读取iPhone的内容,请前往iPhone偏好设置的摘要选项卡,然后单击恢复以将此iPhone恢复为出厂设置

重启itunes: 参考链接&#xff1a; https://baijiahao.baidu.com/s?id1642568736254330322&wfrspider&forpc 人工智能学习网站&#xff1a; https://chat.xutongbao.top

什么是solana PDA账户?

Solana 设计的一个核心理念是万物皆账户&#xff0c;Solana 上的几乎所有数据都可以表示为账户。 在 Solana 上&#xff0c;不仅仅是用户的钱包地址拥有账户&#xff0c;还包括智能合约、数据结构、代币、NFT 等。这些账户可以持有各种类型的数据&#xff0c;包括数字资产、智…

插值表达式、Vue指令、指令补充

vue上手步骤 <body><!-- vue2语法 --><!-- 1.准备容器&#xff1a;一会vue就会把数据展示到这里 --><div id"app"><!-- 4.使用{{ }}即可显示数据 &#xff0c;{{}}就是插值表达式--><p>姓名&#xff1a;{{uname}}</p><…

开源AI引擎|企业合同管理:自然语言处理与OCR技术深度融合

一、企业应用&#xff1a;合同智能管理 结合NLP和OCR技术&#xff0c;企业可以构建智能化的合同管理系统&#xff0c;实现合同的自动化审查、风险评估和知识抽取。这样的系统不仅能够提高合同处理的效率&#xff0c;还能够降低人为错误&#xff0c;加强风险控制。 例如&#x…

Elasticsearch 中误操作删除了所有用户解决办法

如果在 Elasticsearch 中误操作删除了所有用户&#xff0c;可以通过以下步骤重新创建用户和密码&#xff1a; 在配置文件中开启 x-pack 验证&#xff0c;修改config&#xff08;一般是在/usr/share/elasticsearch&#xff09;目录下面的elasticsearch.yml文件&#xff0c;添加…

vue3+threejs新手从零开发卡牌游戏(十八):己方场上手牌添加画线

手牌上场后&#xff0c;点击己方怪兽区卡牌会跟随鼠标移动画出线条&#xff0c;之后可以通过判断鼠标移动到对方场地的某卡牌进行战斗操作&#xff0c;代码主要改动在game/index.vue文件。 1.添加鼠标移动监听事件&#xff08;移动端&#xff09;&#xff1a; window.addEven…

Flink 学习资料

今天就不发帖子啦&#xff0c;今天发现一个好东西啊&#xff0c;喜欢Flink的同学赶紧学习起来啊&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 课程网页链接&#xff1a; GitHub - flink-china/flink-training-course: Flink 中文视频课程&#…

设计模式学习笔记 - 设计模式与范式 -结构型:4.装饰器模式

概述 前面我们学习了代理模式、桥接模式、装饰器模式&#xff0c;本章再来学习一个比较常用的结构性模式&#xff1a;适配器模式。这个模式相对来说比较简单&#xff0c;应用场景也很具体。 关于适配器模式&#xff0c;有类适配器和对象适配器两种实现方式&#xff0c;以及常…

centOS 安装MySQL8.0

1.配置yum仓库 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 2.安装MySQL8.x版本 yum库 rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch.rpm 或者 wget https://dev.mysql.com/get/mysql80-community-release-el7-2.noarch…

相册清理大师-手机重复照片整理、垃圾清理软件

相册清理大师是一款超级简单实用的照片视频整理工具。通过便捷的操作手势&#xff0c;帮助你极速整理相册中的照片和视频、释放手机存储空间。 【功能简介】 向上滑动&#xff1a;删除不要的照片 向左滑动&#xff1a;切换下一张照片 向右滑动&#xff1a;返回上一张照片 整理分…

flutter弹框

alertDialog:弹框 simpleDialog:选择弹框 showModalBottomSheet:底部弹出弹框 showtoast:三方插件弹框 Navigator.of(context).pop(点击取消) 关闭弹框,传递参数 import package:flutter/material.dart; // import package:flutter/cupertino.dart; import package:flut…

excel使用技巧-自动计算过滤后的数据(=SUBTOTAL(109,B2:B110))

语法&#xff1a;SUBTOTAL(function_num,ref1,ref2, …) Function_num 为 1 到 11&#xff08;包含隐藏值&#xff09;或 101 到 111&#xff08;忽略隐藏值&#xff09;之间的数字&#xff0c;指定使用何种函数在列表中进行分类汇总计算。对应的含义如下面表格所示&#xff1…

Java常用的API

跟着黑马的Java学习视频学者本篇常用的API Math public static int abs(int a) {return (a < 0) ? -a : a; }public static double ceil(double a) {return StrictMath.ceil(a); }public static double floor(double a) {return StrictMath.floor(a); }public static doub…

学习JavaEE的日子 Day29 yield,join,线程的中断,守护线程,线程局部变量共享,线程生命周期

Day29 多线程 12. 线程的礼让 Thread.yield(); 理解&#xff1a;此方法为静态方法&#xff0c;此方法写在哪个线程中&#xff0c;哪个线程就礼让 注意&#xff1a;所谓的礼让是指当前线程退出CPU资源&#xff0c;并转到就绪状态&#xff0c;接着再抢 需求&#xff1a;创建两个…