mybatis example处理动态and、or复杂关系的方法

较简单的基本情况,可以去这个网页看https://blog.csdn.net/wang_song_yan/article/details/49081901

我要分享的是比较复杂的情况下的例子(感觉是分享mybatis example的一些缺陷,以及如何解决这些缺陷)
本质就是mybatis example不能直接实现(a)and(b or c),必须要转换成(a and b)or(a and c)才能用的问题。
如果自己写mapper配置文件就会发现,只要涉及到动态查询,就会面临and和or只能二选一的窘境。所以直接用繁琐的方法调用已经给定的方法或者直接静态sql语句,可能才是大道质朴的唯二解法。(泪目)
(希望来个大佬告诉我怎么动态无限制的嵌套and和or,55555)

注意:
1.首个容器如果不手动添加or,则不会在循环中自动的重复添加or。
2.如果手动添加了or,则首个容器的第一条数据会多加载一次,但是由于是or,所以哪怕or了两次也无所谓。
3.代码没有写全,set存储的是未知个数字,vo就是前端传入的一个数据类(HomeTeam是主场队伍,VisitingTeam是客场队伍,set中存储的数据就是为了同时对应主客场球队的属性而传入的,TypeId是赛事类型)不过这些是啥不重要,看到实现方法怎么弄的和我前面说的两个注意点就行。

代码如下:

for (Integer integer :set){
	//开始复数个条件的循环差入
	if (vo!=null){
	     GameExample.Criteria criteria= example.createCriteria();
	     criteria.andHomeTeamIdEqualTo(integer);
	     //调用方法存入其他简单的and条件
	     inputCriteria(criteria,vo);
	     //第一条 条件 数据会重复加载多一次,但这样可以保证后续的第一个 容器 的数据能够or入实例中去
	     example.or(criteria);
	 }
	 //创建第二个and条件的容器
	 if (vo!=null){
	     GameExample.Criteria criteria1 = example.createCriteria();
	     criteria1.andVisitingTeamIdEqualTo(integer);
	     inputCriteria(criteria1,vo);
	     //将第二个容器or入例子中
	     example.or(criteria1);
	 }
}

private void inputCriteria(GameExample.Criteria criteria, QueryVOGame vo){
	if (vo.getBeginDate()!=null){
	    criteria.andGameDateGreaterThanOrEqualTo(vo.getBeginDate());
	}
	if (vo.getEndDate()!=null){
	    criteria.andGameDateLessThanOrEqualTo(vo.getEndDate());
	}
	if (vo.getHomeTeamScore()!=null){
	    criteria.andHomeTeamScoreEqualTo(vo.getHomeTeamScore());
	}
	if (vo.getVisitingTeamScore()!=null){
	    criteria.andVisitingTeamScoreEqualTo(vo.getVisitingTeamScore());
	}
	if (vo.getTypeId()!=null&&vo.getTypeId()!=-1){
	    criteria.andTypeIdEqualTo(vo.getTypeId());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值