Mybatis重置Criteria的正确姿势分享
作者:明明如月学长
这篇文章主要介绍了Mybatis重置Criteria的正确姿势,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
Mybatis重置Criteria
开发中遇到Mybatis生成的Example通过调用createCriteria()来创建Criteria并设置查询条件的情况。
但是需要换一个查询条件再次查询时发现再次调用该方法“无效果"。
看到大多数的做法是通过new一个新的Example来查询,考虑到可能不是最好的或者最合理的做法,对此进行了简单研究。
发现问题原因如下
我们看下生成的Exmaple的源码:
public Criteria createCriteria() { Criteria criteria = createCriteriaInternal(); if (oredCriteria.size() == 0) { oredCriteria.add(criteria); } return criteria; } protected Criteria createCriteriaInternal() { Criteria criteria = new Criteria(); return criteria; }
发现调用createCriteria(),虽然每次创建一个新的Criteria对象但是只有
protected List<Criteria> oredCriteria
这个列表长度为0时才会添加,进去。
查看映射的xml文件时发现,查询条件正是取自于oredCriteria。
只有调用or时才添加到该集合中
public void or(Criteria criteria) { oredCriteria.add(criteria); }
我们想重置查询条件怎么办?
两种方法:
一种是只清空Example的oredCriteria属性。
那么可以通过Example类中的getOredCriteria() 函数获取该列表后通过clear方法清空。
public List<Criteria> getOredCriteria() { return oredCriteria; }
另外一种更彻底的方法,直接调用Example的clear() 方法,将exmple对象“重置”为初始状态。
public void clear() { oredCriteria.clear(); orderByClause = null; distinct = false; pageParam = null; }
得出一个结论
遇到问题,多看源码,多看官方文档。
Mybatis的Criteria用法总结
用一对多内敛查询的时候,有的老铁提出left join in 但是我和同事商讨结果是用代码写处各种list然后stream存到数据库中,这样一来把计算压力从数据库存入服务器,当并发量高了,这样做的好处就体现在性能方面了。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。