Criteria对象解析
一个criteria对象就代表一个条件(比如:A#B),它里面的属性有:
private String key;
private List<Criteria> criteriaChain;
private LinkedHashMap<String, Object> criteria = new LinkedHashMap<String, Object>();
private Object isValue = NOT_SET;
其中:
1.key是用来存放属性名的,属性值存放在两个地方,下边会有介绍
2.criteriaChain:用来存放一系列的条件,具体机制看下边介绍。
3.Criteria:这是一个map集合,也是存放条件,除了is方法代表的条件 外,其他的包括lt,lte,gt,gte,ne,in,nin,mod,all,size,exists,
not,regex等方法都是存放到此map集合中。
4.isValue:用来存放is方法传进来的值
二、where方法和and方法
Where:
这是一个静态的方法,不管你用类名还是用实例对象调用,它的机制是:创建一个criteria对象,把参数传给此对象的key,返回这个对象。
And:
这是一个实例方法,用一个criteria对象调用此方法,它的机制:创建一个新的对象,并把新的对象返回,原先的criteria对象被放在cirteriachain属性中传给了新对象的criteriachain。
Ps:每创建一个criteria对象,都会调用list的add方法把自身放到自己的criteriachain属性中,
不同的是:
通过where: 创建的新对象的criteriachain属性是在构造方法中new出来的,
使用and:它的criteriachain属性是作为构造方法的参数传进去的,而这个参数的来源就是调用and方法的那个criteria对象的criteriachain属性。
也就是说,第一个条件必须通过where方法添加,且只能使用一次,and方法可以使用多次,也就是说第一个保存条件的criteria对象是通过where方法创建的,其他的条件对象criteria是通过and方法创建的,然后所有的criteria对象都会保存在最后一个criteria对象的list集合也即是criteriachain对象中。
所以:
1,对于条件式:A#B,
A一般通过where和and方法的参数传入,
#代表一种关系,有具体的方法名与它对应,B则是作为方法参数传进去。
如果#代表的关系是等于,则B保存在isValue中,其他的则是:关系符#和B作为键值对保存到那个map集合(自己的一个属性,即criteria属性中)里边,
2.一个criteria对象只保存一个条件,多个条件通过多个criteria对象表现,每创建一个criteria对象,都会把自身添加到自己的criteriachain属性中,至于这个criteriachain属性是怎么来的,前面已经说过了。
3.如果第二次使用where,则以前的条件就会丢失,因为它的criteriachain是新建的,并不是以前的,而以前的条件都是保存在criteriachain属性中的。这就是where和and的不同。
ps:
4.一个属性只能对应于一个criteria对象,属性与criteria对象之间是一对一的关系,一个criteria对象只有一个key属性,用来保存属性名,所以一个对象对应一个属性。一个criteria可以向自己的map属性中放多个条件,如条件age>3和age<5.这两个条件都可以放到map集合中。
问题:isValue和map可以同时有值吗?(个人认为不能)
如有高见,请留言!