前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis重置Criteria的正确姿势

Mybatis重置Criteria的正确姿势

作者头像
明明如月学长
发布2021-08-27 16:27:52
1.4K0
发布2021-08-27 16:27:52
举报
文章被收录于专栏:明明如月的技术专栏

开发中遇到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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/08/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档