开发中遇到Mybatis生成的Example通过调用createCriteria()来创建Criteria并设置查询条件的情况。
但是需要换一个查询条件再次查询时发现再次调用该方法“无效果"。
看到大多数的做法是通过new一个新的Example来查询,考虑到可能不是最好的或者最合理的做法,对此进行了简单研究。
发现问题原因如下,我们看下生成的Exmaple的源码:
代码语言:javascript复制 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对象但是只有
代码语言:javascript复制protected List oredCriteria
这个列表长度为0时才会添加,进去。
查看映射的xml文件时发现,查询条件正是取自于oredCriteria。
只有调用or时才添加到该集合中
代码语言:javascript复制 public void or(Criteria criteria) {
oredCriteria.add(criteria);
}
那么我们想重置查询条件怎么办?
两种方法:
一种是只清空Example的oredCriteria属性。
那么可以通过Example类中的getOredCriteria() 函数获取该列表后通过clear方法清空。
代码语言:javascript复制public List getOredCriteria() {
return oredCriteria;
}
另外一种更彻底的方法,直接调用Example的clear() 方法,将exmple对象“重置”为初始状态。
代码语言:javascript复制 public void clear() {
oredCriteria.clear();
orderByClause = null;
distinct = false;
pageParam = null;
}
得出一个结论:遇到问题,多看源码,多看官方文档。
作者:明明如月 转载请注明出处 https://cloud.tencent.com/developer/article/1868913