最近在项目上遇到了点关于mybatis的查询问题.
 常见的mybatis查询方式是:
 ServiceExample.Criteria srCriteria = serviceExample.createCriteria();
			ServiceExample serviceExample = new ServiceExample();
            ServiceExample.Criteria srCriteria = serviceExample.createCriteria();
            srCriteria.andProjectEqualTo(project.getId());
            srCriteria.andTypeEqualTo(1);
            Service service = questionService.getService(serviceExample);或者
 ServiceExample.Criteria srCriteria = serviceExample.or();
那么,这两者有什么区别,改什么时候用哪个呢.
查看源码:
 createCriteria()方法,只是在第一次建的时候,会把criteria放到oredCriteria中,其他时候,则不会;
 (所以要小心.切记只有确认是第一次或者之前的已经被清空了,才能用createCriteria()方法.
 不然就需要手动调用example.or(criteria)或者example.and(criteria),把后续新建的criteria加入
 oredCriteria列表中,不然后面的criteria均不会作为查询条件
 )
而or()方法,则是每次都会把新建的Criteria 放入oredCriteria中,即:类似于or查询条件.多个联合.
   public Criteria createCriteria() {
        Criteria criteria = createCriteriaInternal();
        if (oredCriteria.size() == 0) {
            oredCriteria.add(criteria);
        }
        return criteria;
    }
    
public Criteria createCriteria() {
        Criteria criteria = createCriteriaInternal();
        if (oredCriteria.size() == 0) {
            oredCriteria.add(criteria);
        }
        return criteria;
    }
    protected Criteria createCriteriaInternal() {
        Criteria criteria = new Criteria();
        return criteria;
    }
    
	public Criteria or() {
        Criteria criteria = createCriteriaInternal();
        oredCriteria.add(criteria);
        return criteria;
    }清空查询条件
xxxExampler.clear();
 public void clear() {
 oredCriteria.clear();
 orderByClause = null;
 distinct = false;
 }
yuanma
public class ServiceExample extends AbstractPojo {
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database table service
     *
     * @mbggenerated
     */
    protected String orderByClause;
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database table service
     *
     * @mbggenerated
     */
    protected boolean distinct;
    /**
     * This field was generated by MyBatis Generator.
     * This field corresponds to the database table service
     *
     * @mbggenerated
     */
    protected List<Criteria> oredCriteria;
    /**
     * This method was generated by MyBatis Generator.
     * This method corresponds to the database table service
     *
     * @mbggenerated
     */
    public void clear() {
        oredCriteria.clear();
        orderByClause = null;
        distinct = false;
    }
}测试条件
         //测试
        ProductExample productExample = new ProductExample();
        ProductExample.Criteria productCriteria = productExample.createCriteria();
        productCriteria.andIdEqualTo(5L);
        
        ProductExample.Criteria productCriteria4 = productExample.createCriteria();
        productCriteria4.andIdEqualTo(6L);
        //查出来的还是id是5的,因为第二次调用ProductExample.Criteria productCriteria4 = productExample.createCriteria();
        //所产生的Criteria并未放入productExample的List<Criteria> oredCriteria中.用or方法产生的才会放入
        List<Product> products = sqlSession.selectList("ProductMapper.selectByExample", productExample);
        //能查出一个
        System.out.println("product1:" + products.toString());
        
        //能查出两个.or条件的作用.
        ProductExample.Criteria productCriteriaOr = productExample.or();
        productCriteriaOr.andIdEqualTo(6L);
        List<Product> products2 = sqlSession.selectList("ProductMapper.selectByExample", productExample);
        System.out.println("product2:" + products2.toString());
        
        //调用清空方法,清空之前的查询条件
        productExample.clear();
        //清空之后,需要重新生成查询条件Criteria
        productCriteria = productExample.createCriteria();
        //不设置条件,相当于不需要条件,全部查出了
        //productCriteria.andIdEqualTo(5L);
        List<Product> products3 = sqlSession.selectList("ProductMapper.selectByExample", productExample);
        System.out.println("product3:" + products3.toString());