赞
踩
较简单的基本情况,可以去这个网页看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()); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。