Mybatis中example类实现用and连接不同的Criteria、同个Criteria对象内可用or连接

效果

SELECT count(0)
 FROM tb_holiday
 WHERE (holiday_type = '0') AND (end_time BETWEEN '2020-01-01 00:00:00.0' AND '2021-01-01 00:00:00.0' OR is_loop = '0');

Service类

service层list方法内

//criteria对象要放在list,才能和xml文件的oredCriteria对应
List<TbHolidayExample1.Criteria> list = tbHolidayExample.getOredCriteria();
            TbHolidayExample1.Criteria criteria1 = tbHolidayExample.createCriteria();
            list.add(criteria1);
            criteria1.andEndTimeBetween(beginDate, endDate);
            //新增方法
            criteria1.orIsLoopEqualTo('0', true);

Example类

新增一个用or连接的方法

//新增:不同Criteria对象之间用and连接,同个对象之间不同查询条件之间可用or连接
        public Criteria orIsLoopEqualTo(Character value, Boolean isOr) {
            addCriterion(value, "is_loop = ", "isLoop", isOr);
            return (Criteria) this;
        }

新增一个addCriterion方法(方法重载-参数调换下位置、调用了新增的Criterion构造方法)

//新增:不同Criteria对象之间用and连接,同个对象之间不同查询条件之间可用or连接
        protected void addCriterion(Object value, String condition, String property, Boolean isOr) {
            if (value == null) {
                throw new RuntimeException("Value for " + property + " cannot be null");
            }
            criteria.add(new Criterion(value, condition, isOr));
        }

新增Criterion构造方法(新增一个参数、需提前在Example类里的Criterion类新增一个布尔类型的orValue变量)

//新增:不同Criteria对象之间用and连接,同个对象之间不同查询条件之间可用or连接
        protected Criterion(Object value, String condition, Boolean isOr) {
            super();
            this.value = value;
            this.condition = condition;
            this.typeHandler = null;
            this.orValue = isOr;
        }

Mapper.xml文件

separator=“and”:表示不同Criteria对象之间用and连接
choose when:表示如果为真则用and或者or拼接的SQL语句

    <sql id="Example_Where_Clause">
        <where>
            <foreach collection="oredCriteria" item="criteria" separator="and">
                <if test="criteria.valid">
                    <trim prefix="(" prefixOverrides="and" suffix=")">
                        <foreach collection="criteria.criteria" item="criterion">
                            <choose>
                                <when test="criterion.noValue">
                                    and ${criterion.condition}
                                </when>
                                <when test="criterion.singleValue">
                                    and ${criterion.condition} #{criterion.value}
                                </when>
                                <when test="criterion.betweenValue">
                                    and ${criterion.condition} #{criterion.value} and #{criterion.secondValue}
                                </when>
                                <when test="criterion.orValue">
                                    or ${criterion.condition} #{criterion.value}
                                </when>
                                <when test="criterion.listValue">
                                    and ${criterion.condition}
                                    <foreach close=")" collection="criterion.value" item="listItem" open="("
                                             separator=",">
                                        #{listItem}
                                    </foreach>
                                </when>
                            </choose>
                        </foreach>
                    </trim>
                </if>
            </foreach>
        </where>
    </sql>
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值