View Javadoc
1   /**
2    *    Copyright 2006-2016 the original author or authors.
3    *
4    *    Licensed under the Apache License, Version 2.0 (the "License");
5    *    you may not use this file except in compliance with the License.
6    *    You may obtain a copy of the License at
7    *
8    *       http://www.apache.org/licenses/LICENSE-2.0
9    *
10   *    Unless required by applicable law or agreed to in writing, software
11   *    distributed under the License is distributed on an "AS IS" BASIS,
12   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *    See the License for the specific language governing permissions and
14   *    limitations under the License.
15   */
16  package org.mybatis.generator.codegen.mybatis3.model;
17  
18  import static org.mybatis.generator.internal.util.JavaBeansUtil.getGetterMethodName;
19  import static org.mybatis.generator.internal.util.StringUtility.stringHasValue;
20  import static org.mybatis.generator.internal.util.messages.Messages.getString;
21  
22  import java.util.ArrayList;
23  import java.util.Iterator;
24  import java.util.List;
25  
26  import org.mybatis.generator.api.CommentGenerator;
27  import org.mybatis.generator.api.FullyQualifiedTable;
28  import org.mybatis.generator.api.IntrospectedColumn;
29  import org.mybatis.generator.api.dom.OutputUtilities;
30  import org.mybatis.generator.api.dom.java.CompilationUnit;
31  import org.mybatis.generator.api.dom.java.Field;
32  import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
33  import org.mybatis.generator.api.dom.java.InnerClass;
34  import org.mybatis.generator.api.dom.java.JavaVisibility;
35  import org.mybatis.generator.api.dom.java.Method;
36  import org.mybatis.generator.api.dom.java.Parameter;
37  import org.mybatis.generator.api.dom.java.TopLevelClass;
38  import org.mybatis.generator.codegen.AbstractJavaGenerator;
39  import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
40  
41  /**
42   * 
43   * @author Jeff Butler
44   * 
45   */
46  public class ExampleGenerator extends AbstractJavaGenerator {
47  
48      public ExampleGenerator() {
49          super();
50      }
51  
52      @Override
53      public List<CompilationUnit> getCompilationUnits() {
54          FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable();
55          progressCallback.startTask(getString(
56                  "Progress.6", table.toString())); //$NON-NLS-1$
57          CommentGenerator commentGenerator = context.getCommentGenerator();
58  
59          FullyQualifiedJavaType type = new FullyQualifiedJavaType(
60                  introspectedTable.getExampleType());
61          TopLevelClass topLevelClass = new TopLevelClass(type);
62          topLevelClass.setVisibility(JavaVisibility.PUBLIC);
63          commentGenerator.addJavaFileComment(topLevelClass);
64  
65          // add default constructor
66          Method method = new Method();
67          method.setVisibility(JavaVisibility.PUBLIC);
68          method.setConstructor(true);
69          method.setName(type.getShortName());
70          method.addBodyLine("oredCriteria = new ArrayList<Criteria>();"); //$NON-NLS-1$
71  
72          commentGenerator.addGeneralMethodComment(method, introspectedTable);
73          topLevelClass.addMethod(method);
74  
75          // add field, getter, setter for orderby clause
76          Field field = new Field();
77          field.setVisibility(JavaVisibility.PROTECTED);
78          field.setType(FullyQualifiedJavaType.getStringInstance());
79          field.setName("orderByClause"); //$NON-NLS-1$
80          commentGenerator.addFieldComment(field, introspectedTable);
81          topLevelClass.addField(field);
82  
83          method = new Method();
84          method.setVisibility(JavaVisibility.PUBLIC);
85          method.setName("setOrderByClause"); //$NON-NLS-1$
86          method.addParameter(new Parameter(FullyQualifiedJavaType
87                  .getStringInstance(), "orderByClause")); //$NON-NLS-1$
88          method.addBodyLine("this.orderByClause = orderByClause;"); //$NON-NLS-1$
89          commentGenerator.addGeneralMethodComment(method, introspectedTable);
90          topLevelClass.addMethod(method);
91  
92          method = new Method();
93          method.setVisibility(JavaVisibility.PUBLIC);
94          method.setReturnType(FullyQualifiedJavaType.getStringInstance());
95          method.setName("getOrderByClause"); //$NON-NLS-1$
96          method.addBodyLine("return orderByClause;"); //$NON-NLS-1$
97          commentGenerator.addGeneralMethodComment(method, introspectedTable);
98          topLevelClass.addMethod(method);
99  
100         // add field, getter, setter for distinct
101         field = new Field();
102         field.setVisibility(JavaVisibility.PROTECTED);
103         field.setType(FullyQualifiedJavaType.getBooleanPrimitiveInstance());
104         field.setName("distinct"); //$NON-NLS-1$
105         commentGenerator.addFieldComment(field, introspectedTable);
106         topLevelClass.addField(field);
107 
108         method = new Method();
109         method.setVisibility(JavaVisibility.PUBLIC);
110         method.setName("setDistinct"); //$NON-NLS-1$
111         method.addParameter(new Parameter(FullyQualifiedJavaType
112                 .getBooleanPrimitiveInstance(), "distinct")); //$NON-NLS-1$
113         method.addBodyLine("this.distinct = distinct;"); //$NON-NLS-1$
114         commentGenerator.addGeneralMethodComment(method, introspectedTable);
115         topLevelClass.addMethod(method);
116 
117         method = new Method();
118         method.setVisibility(JavaVisibility.PUBLIC);
119         method.setReturnType(FullyQualifiedJavaType
120                 .getBooleanPrimitiveInstance());
121         method.setName("isDistinct"); //$NON-NLS-1$
122         method.addBodyLine("return distinct;"); //$NON-NLS-1$
123         commentGenerator.addGeneralMethodComment(method, introspectedTable);
124         topLevelClass.addMethod(method);
125 
126         // add field and methods for the list of ored criteria
127         field = new Field();
128         field.setVisibility(JavaVisibility.PROTECTED);
129 
130         FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType(
131                 "java.util.List<Criteria>"); //$NON-NLS-1$
132         field.setType(fqjt);
133         field.setName("oredCriteria"); //$NON-NLS-1$
134         commentGenerator.addFieldComment(field, introspectedTable);
135         topLevelClass.addField(field);
136 
137         method = new Method();
138         method.setVisibility(JavaVisibility.PUBLIC);
139         method.setReturnType(fqjt);
140         method.setName("getOredCriteria"); //$NON-NLS-1$
141         method.addBodyLine("return oredCriteria;"); //$NON-NLS-1$
142         commentGenerator.addGeneralMethodComment(method, introspectedTable);
143         topLevelClass.addMethod(method);
144 
145         method = new Method();
146         method.setVisibility(JavaVisibility.PUBLIC);
147         method.setName("or"); //$NON-NLS-1$
148         method.addParameter(new Parameter(FullyQualifiedJavaType
149                 .getCriteriaInstance(), "criteria")); //$NON-NLS-1$
150         method.addBodyLine("oredCriteria.add(criteria);"); //$NON-NLS-1$
151         commentGenerator.addGeneralMethodComment(method, introspectedTable);
152         topLevelClass.addMethod(method);
153 
154         method = new Method();
155         method.setVisibility(JavaVisibility.PUBLIC);
156         method.setName("or"); //$NON-NLS-1$
157         method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
158         method.addBodyLine("Criteria criteria = createCriteriaInternal();"); //$NON-NLS-1$
159         method.addBodyLine("oredCriteria.add(criteria);"); //$NON-NLS-1$
160         method.addBodyLine("return criteria;"); //$NON-NLS-1$
161         commentGenerator.addGeneralMethodComment(method, introspectedTable);
162         topLevelClass.addMethod(method);
163 
164         method = new Method();
165         method.setVisibility(JavaVisibility.PUBLIC);
166         method.setName("createCriteria"); //$NON-NLS-1$
167         method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
168         method.addBodyLine("Criteria criteria = createCriteriaInternal();"); //$NON-NLS-1$
169         method.addBodyLine("if (oredCriteria.size() == 0) {"); //$NON-NLS-1$
170         method.addBodyLine("oredCriteria.add(criteria);"); //$NON-NLS-1$
171         method.addBodyLine("}"); //$NON-NLS-1$
172         method.addBodyLine("return criteria;"); //$NON-NLS-1$
173         commentGenerator.addGeneralMethodComment(method, introspectedTable);
174         topLevelClass.addMethod(method);
175 
176         method = new Method();
177         method.setVisibility(JavaVisibility.PROTECTED);
178         method.setName("createCriteriaInternal"); //$NON-NLS-1$
179         method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
180         method.addBodyLine("Criteria criteria = new Criteria();"); //$NON-NLS-1$
181         method.addBodyLine("return criteria;"); //$NON-NLS-1$
182         commentGenerator.addGeneralMethodComment(method, introspectedTable);
183         topLevelClass.addMethod(method);
184 
185         method = new Method();
186         method.setVisibility(JavaVisibility.PUBLIC);
187         method.setName("clear"); //$NON-NLS-1$
188         method.addBodyLine("oredCriteria.clear();"); //$NON-NLS-1$
189         method.addBodyLine("orderByClause = null;"); //$NON-NLS-1$
190         method.addBodyLine("distinct = false;"); //$NON-NLS-1$
191         commentGenerator.addGeneralMethodComment(method, introspectedTable);
192         topLevelClass.addMethod(method);
193 
194         // now generate the inner class that holds the AND conditions
195         topLevelClass
196                 .addInnerClass(getGeneratedCriteriaInnerClass(topLevelClass));
197 
198         topLevelClass.addInnerClass(getCriteriaInnerClass());
199 
200         topLevelClass.addInnerClass(getCriterionInnerClass());
201 
202         List<CompilationUnit> answer = new ArrayList<CompilationUnit>();
203         if (context.getPlugins().modelExampleClassGenerated(
204                 topLevelClass, introspectedTable)) {
205             answer.add(topLevelClass);
206         }
207         return answer;
208     }
209 
210     private InnerClass getCriterionInnerClass() {
211         Field field;
212         Method method;
213 
214         InnerClass answer = new InnerClass(new FullyQualifiedJavaType(
215                 "Criterion")); //$NON-NLS-1$
216         answer.setVisibility(JavaVisibility.PUBLIC);
217         answer.setStatic(true);
218         context.getCommentGenerator().addClassComment(answer,
219                 introspectedTable);
220 
221         field = new Field();
222         field.setName("condition"); //$NON-NLS-1$
223         field.setType(FullyQualifiedJavaType.getStringInstance());
224         field.setVisibility(JavaVisibility.PRIVATE);
225         answer.addField(field);
226         answer.addMethod(getGetter(field));
227 
228         field = new Field();
229         field.setName("value"); //$NON-NLS-1$
230         field.setType(FullyQualifiedJavaType.getObjectInstance());
231         field.setVisibility(JavaVisibility.PRIVATE);
232         answer.addField(field);
233         answer.addMethod(getGetter(field));
234 
235         field = new Field();
236         field.setName("secondValue"); //$NON-NLS-1$
237         field.setType(FullyQualifiedJavaType.getObjectInstance());
238         field.setVisibility(JavaVisibility.PRIVATE);
239         answer.addField(field);
240         answer.addMethod(getGetter(field));
241 
242         field = new Field();
243         field.setName("noValue"); //$NON-NLS-1$
244         field.setType(FullyQualifiedJavaType.getBooleanPrimitiveInstance());
245         field.setVisibility(JavaVisibility.PRIVATE);
246         answer.addField(field);
247         answer.addMethod(getGetter(field));
248 
249         field = new Field();
250         field.setName("singleValue"); //$NON-NLS-1$
251         field.setType(FullyQualifiedJavaType.getBooleanPrimitiveInstance());
252         field.setVisibility(JavaVisibility.PRIVATE);
253         answer.addField(field);
254         answer.addMethod(getGetter(field));
255 
256         field = new Field();
257         field.setName("betweenValue"); //$NON-NLS-1$
258         field.setType(FullyQualifiedJavaType.getBooleanPrimitiveInstance());
259         field.setVisibility(JavaVisibility.PRIVATE);
260         answer.addField(field);
261         answer.addMethod(getGetter(field));
262 
263         field = new Field();
264         field.setName("listValue"); //$NON-NLS-1$
265         field.setType(FullyQualifiedJavaType.getBooleanPrimitiveInstance());
266         field.setVisibility(JavaVisibility.PRIVATE);
267         answer.addField(field);
268         answer.addMethod(getGetter(field));
269 
270         field = new Field();
271         field.setName("typeHandler"); //$NON-NLS-1$
272         field.setType(FullyQualifiedJavaType.getStringInstance());
273         field.setVisibility(JavaVisibility.PRIVATE);
274         answer.addField(field);
275         answer.addMethod(getGetter(field));
276 
277         method = new Method();
278         method.setVisibility(JavaVisibility.PROTECTED);
279         method.setName("Criterion"); //$NON-NLS-1$
280         method.setConstructor(true);
281         method.addParameter(new Parameter(FullyQualifiedJavaType
282                 .getStringInstance(), "condition")); //$NON-NLS-1$
283         method.addBodyLine("super();"); //$NON-NLS-1$
284         method.addBodyLine("this.condition = condition;"); //$NON-NLS-1$
285         method.addBodyLine("this.typeHandler = null;"); //$NON-NLS-1$
286         method.addBodyLine("this.noValue = true;"); //$NON-NLS-1$
287         answer.addMethod(method);
288 
289         method = new Method();
290         method.setVisibility(JavaVisibility.PROTECTED);
291         method.setName("Criterion"); //$NON-NLS-1$
292         method.setConstructor(true);
293         method.addParameter(new Parameter(FullyQualifiedJavaType
294                 .getStringInstance(), "condition")); //$NON-NLS-1$
295         method.addParameter(new Parameter(FullyQualifiedJavaType
296                 .getObjectInstance(), "value")); //$NON-NLS-1$
297         method.addParameter(new Parameter(FullyQualifiedJavaType
298                 .getStringInstance(), "typeHandler")); //$NON-NLS-1$
299         method.addBodyLine("super();"); //$NON-NLS-1$
300         method.addBodyLine("this.condition = condition;"); //$NON-NLS-1$
301         method.addBodyLine("this.value = value;"); //$NON-NLS-1$
302         method.addBodyLine("this.typeHandler = typeHandler;"); //$NON-NLS-1$
303         method.addBodyLine("if (value instanceof List<?>) {"); //$NON-NLS-1$
304         method.addBodyLine("this.listValue = true;"); //$NON-NLS-1$
305         method.addBodyLine("} else {"); //$NON-NLS-1$
306         method.addBodyLine("this.singleValue = true;"); //$NON-NLS-1$
307         method.addBodyLine("}"); //$NON-NLS-1$
308         answer.addMethod(method);
309 
310         method = new Method();
311         method.setVisibility(JavaVisibility.PROTECTED);
312         method.setName("Criterion"); //$NON-NLS-1$
313         method.setConstructor(true);
314         method.addParameter(new Parameter(FullyQualifiedJavaType
315                 .getStringInstance(), "condition")); //$NON-NLS-1$
316         method.addParameter(new Parameter(FullyQualifiedJavaType
317                 .getObjectInstance(), "value")); //$NON-NLS-1$
318         method.addBodyLine("this(condition, value, null);"); //$NON-NLS-1$
319         answer.addMethod(method);
320 
321         method = new Method();
322         method.setVisibility(JavaVisibility.PROTECTED);
323         method.setName("Criterion"); //$NON-NLS-1$
324         method.setConstructor(true);
325         method.addParameter(new Parameter(FullyQualifiedJavaType
326                 .getStringInstance(), "condition")); //$NON-NLS-1$
327         method.addParameter(new Parameter(FullyQualifiedJavaType
328                 .getObjectInstance(), "value")); //$NON-NLS-1$
329         method.addParameter(new Parameter(FullyQualifiedJavaType
330                 .getObjectInstance(), "secondValue")); //$NON-NLS-1$
331         method.addParameter(new Parameter(FullyQualifiedJavaType
332                 .getStringInstance(), "typeHandler")); //$NON-NLS-1$
333         method.addBodyLine("super();"); //$NON-NLS-1$
334         method.addBodyLine("this.condition = condition;"); //$NON-NLS-1$
335         method.addBodyLine("this.value = value;"); //$NON-NLS-1$
336         method.addBodyLine("this.secondValue = secondValue;"); //$NON-NLS-1$
337         method.addBodyLine("this.typeHandler = typeHandler;"); //$NON-NLS-1$
338         method.addBodyLine("this.betweenValue = true;"); //$NON-NLS-1$
339         answer.addMethod(method);
340 
341         method = new Method();
342         method.setVisibility(JavaVisibility.PROTECTED);
343         method.setName("Criterion"); //$NON-NLS-1$
344         method.setConstructor(true);
345         method.addParameter(new Parameter(FullyQualifiedJavaType
346                 .getStringInstance(), "condition")); //$NON-NLS-1$
347         method.addParameter(new Parameter(FullyQualifiedJavaType
348                 .getObjectInstance(), "value")); //$NON-NLS-1$
349         method.addParameter(new Parameter(FullyQualifiedJavaType
350                 .getObjectInstance(), "secondValue")); //$NON-NLS-1$
351         method.addBodyLine("this(condition, value, secondValue, null);"); //$NON-NLS-1$
352         answer.addMethod(method);
353 
354         return answer;
355     }
356 
357     private InnerClass getCriteriaInnerClass() {
358         Method method;
359 
360         InnerClass answer = new InnerClass(FullyQualifiedJavaType
361                 .getCriteriaInstance());
362 
363         answer.setVisibility(JavaVisibility.PUBLIC);
364         answer.setStatic(true);
365         answer.setSuperClass(FullyQualifiedJavaType
366                 .getGeneratedCriteriaInstance());
367 
368         context.getCommentGenerator().addClassComment(answer,
369                 introspectedTable, true);
370 
371         method = new Method();
372         method.setVisibility(JavaVisibility.PROTECTED);
373         method.setName("Criteria"); //$NON-NLS-1$
374         method.setConstructor(true);
375         method.addBodyLine("super();"); //$NON-NLS-1$
376         answer.addMethod(method);
377 
378         return answer;
379     }
380 
381     private InnerClass getGeneratedCriteriaInnerClass(
382             TopLevelClass topLevelClass) {
383         Field field;
384         Method method;
385 
386         InnerClass answer = new InnerClass(FullyQualifiedJavaType
387                 .getGeneratedCriteriaInstance());
388 
389         answer.setVisibility(JavaVisibility.PROTECTED);
390         answer.setStatic(true);
391         answer.setAbstract(true);
392         context.getCommentGenerator().addClassComment(answer,
393                 introspectedTable);
394 
395         method = new Method();
396         method.setVisibility(JavaVisibility.PROTECTED);
397         method.setName("GeneratedCriteria"); //$NON-NLS-1$
398         method.setConstructor(true);
399         method.addBodyLine("super();"); //$NON-NLS-1$
400         method.addBodyLine("criteria = new ArrayList<Criterion>();"); //$NON-NLS-1$
401         answer.addMethod(method);
402 
403         List<String> criteriaLists = new ArrayList<String>();
404         criteriaLists.add("criteria"); //$NON-NLS-1$
405 
406         for (IntrospectedColumn introspectedColumn : introspectedTable
407                 .getNonBLOBColumns()) {
408             if (stringHasValue(introspectedColumn
409                     .getTypeHandler())) {
410                 String name = addtypeHandledObjectsAndMethods(
411                         introspectedColumn, method, answer);
412                 criteriaLists.add(name);
413             }
414         }
415 
416         // now generate the isValid method
417         method = new Method();
418         method.setVisibility(JavaVisibility.PUBLIC);
419         method.setName("isValid"); //$NON-NLS-1$
420         method.setReturnType(FullyQualifiedJavaType
421                 .getBooleanPrimitiveInstance());
422         StringBuilder sb = new StringBuilder();
423         Iterator<String> strIter = criteriaLists.iterator();
424         sb.append("return "); //$NON-NLS-1$
425         sb.append(strIter.next());
426         sb.append(".size() > 0"); //$NON-NLS-1$
427         if (!strIter.hasNext()) {
428             sb.append(';');
429         }
430         method.addBodyLine(sb.toString());
431         while (strIter.hasNext()) {
432             sb.setLength(0);
433             OutputUtilities.javaIndent(sb, 1);
434             sb.append("|| "); //$NON-NLS-1$
435             sb.append(strIter.next());
436             sb.append(".size() > 0"); //$NON-NLS-1$
437             if (!strIter.hasNext()) {
438                 sb.append(';');
439             }
440             method.addBodyLine(sb.toString());
441         }
442         answer.addMethod(method);
443 
444         // now generate the getAllCriteria method
445         if (criteriaLists.size() > 1) {
446             field = new Field();
447             field.setName("allCriteria"); //$NON-NLS-1$
448             field.setType(new FullyQualifiedJavaType("List<Criterion>")); //$NON-NLS-1$
449             field.setVisibility(JavaVisibility.PROTECTED);
450             answer.addField(field);
451         }
452         
453         method = new Method();
454         method.setVisibility(JavaVisibility.PUBLIC);
455         method.setName("getAllCriteria"); //$NON-NLS-1$
456         method.setReturnType(new FullyQualifiedJavaType("List<Criterion>")); //$NON-NLS-1$
457         if (criteriaLists.size() < 2) {
458             method.addBodyLine("return criteria;"); //$NON-NLS-1$
459         } else {
460             method.addBodyLine("if (allCriteria == null) {"); //$NON-NLS-1$
461             method.addBodyLine("allCriteria = new ArrayList<Criterion>();"); //$NON-NLS-1$
462             
463             strIter = criteriaLists.iterator();
464             while (strIter.hasNext()) {
465                 method.addBodyLine(String.format("allCriteria.addAll(%s);", strIter.next())); //$NON-NLS-1$
466             }
467 
468             method.addBodyLine("}"); //$NON-NLS-1$
469             method.addBodyLine("return allCriteria;"); //$NON-NLS-1$
470         }
471         answer.addMethod(method);
472         
473         // now we need to generate the methods that will be used in the SqlMap
474         // to generate the dynamic where clause
475         topLevelClass.addImportedType(FullyQualifiedJavaType
476                 .getNewListInstance());
477         topLevelClass.addImportedType(FullyQualifiedJavaType
478                 .getNewArrayListInstance());
479 
480         field = new Field();
481         field.setVisibility(JavaVisibility.PROTECTED);
482         FullyQualifiedJavaType listOfCriterion = new FullyQualifiedJavaType(
483                 "java.util.List<Criterion>"); //$NON-NLS-1$
484         field.setType(listOfCriterion);
485         field.setName("criteria"); //$NON-NLS-1$
486         answer.addField(field);
487 
488         method = new Method();
489         method.setVisibility(JavaVisibility.PUBLIC);
490         method.setReturnType(field.getType());
491         method.setName(getGetterMethodName(field.getName(), field
492                 .getType()));
493         method.addBodyLine("return criteria;"); //$NON-NLS-1$
494         answer.addMethod(method);
495 
496         // now add the methods for simplifying the individual field set methods
497         method = new Method();
498         method.setVisibility(JavaVisibility.PROTECTED);
499         method.setName("addCriterion"); //$NON-NLS-1$
500         method.addParameter(new Parameter(FullyQualifiedJavaType
501                 .getStringInstance(), "condition")); //$NON-NLS-1$
502         method.addBodyLine("if (condition == null) {"); //$NON-NLS-1$
503         method
504                 .addBodyLine("throw new RuntimeException(\"Value for condition cannot be null\");"); //$NON-NLS-1$
505         method.addBodyLine("}"); //$NON-NLS-1$
506         method.addBodyLine("criteria.add(new Criterion(condition));"); //$NON-NLS-1$
507         if (criteriaLists.size() > 1) {
508             method.addBodyLine("allCriteria = null;"); //$NON-NLS-1$
509         }
510         answer.addMethod(method);
511 
512         method = new Method();
513         method.setVisibility(JavaVisibility.PROTECTED);
514         method.setName("addCriterion"); //$NON-NLS-1$
515         method.addParameter(new Parameter(FullyQualifiedJavaType
516                 .getStringInstance(), "condition")); //$NON-NLS-1$
517         method.addParameter(new Parameter(FullyQualifiedJavaType
518                 .getObjectInstance(), "value")); //$NON-NLS-1$
519         method.addParameter(new Parameter(FullyQualifiedJavaType
520                 .getStringInstance(), "property")); //$NON-NLS-1$
521         method.addBodyLine("if (value == null) {"); //$NON-NLS-1$
522         method
523                 .addBodyLine("throw new RuntimeException(\"Value for \" + property + \" cannot be null\");"); //$NON-NLS-1$
524         method.addBodyLine("}"); //$NON-NLS-1$
525         method.addBodyLine("criteria.add(new Criterion(condition, value));"); //$NON-NLS-1$
526         if (criteriaLists.size() > 1) {
527             method.addBodyLine("allCriteria = null;"); //$NON-NLS-1$
528         }
529         answer.addMethod(method);
530 
531         method = new Method();
532         method.setVisibility(JavaVisibility.PROTECTED);
533         method.setName("addCriterion"); //$NON-NLS-1$
534         method.addParameter(new Parameter(FullyQualifiedJavaType
535                 .getStringInstance(), "condition")); //$NON-NLS-1$
536         method.addParameter(new Parameter(FullyQualifiedJavaType
537                 .getObjectInstance(), "value1")); //$NON-NLS-1$
538         method.addParameter(new Parameter(FullyQualifiedJavaType
539                 .getObjectInstance(), "value2")); //$NON-NLS-1$
540         method.addParameter(new Parameter(FullyQualifiedJavaType
541                 .getStringInstance(), "property")); //$NON-NLS-1$
542         method.addBodyLine("if (value1 == null || value2 == null) {"); //$NON-NLS-1$
543         method
544                 .addBodyLine("throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");"); //$NON-NLS-1$
545         method.addBodyLine("}"); //$NON-NLS-1$
546         method
547                 .addBodyLine("criteria.add(new Criterion(condition, value1, value2));"); //$NON-NLS-1$
548         if (criteriaLists.size() > 1) {
549             method.addBodyLine("allCriteria = null;"); //$NON-NLS-1$
550         }
551         answer.addMethod(method);
552 
553         FullyQualifiedJavaType listOfDates = new FullyQualifiedJavaType(
554                 "java.util.List<java.util.Date>"); //$NON-NLS-1$
555 
556         if (introspectedTable.hasJDBCDateColumns()) {
557             topLevelClass.addImportedType(FullyQualifiedJavaType
558                     .getDateInstance());
559             topLevelClass.addImportedType(FullyQualifiedJavaType
560                     .getNewIteratorInstance());
561             method = new Method();
562             method.setVisibility(JavaVisibility.PROTECTED);
563             method.setName("addCriterionForJDBCDate"); //$NON-NLS-1$
564             method.addParameter(new Parameter(FullyQualifiedJavaType
565                     .getStringInstance(), "condition")); //$NON-NLS-1$
566             method.addParameter(new Parameter(FullyQualifiedJavaType
567                     .getDateInstance(), "value")); //$NON-NLS-1$
568             method.addParameter(new Parameter(FullyQualifiedJavaType
569                     .getStringInstance(), "property")); //$NON-NLS-1$
570             method.addBodyLine("if (value == null) {"); //$NON-NLS-1$
571             method
572                     .addBodyLine("throw new RuntimeException(\"Value for \" + property + \" cannot be null\");"); //$NON-NLS-1$
573             method.addBodyLine("}"); //$NON-NLS-1$
574             method
575                     .addBodyLine("addCriterion(condition, new java.sql.Date(value.getTime()), property);"); //$NON-NLS-1$
576             answer.addMethod(method);
577 
578             method = new Method();
579             method.setVisibility(JavaVisibility.PROTECTED);
580             method.setName("addCriterionForJDBCDate"); //$NON-NLS-1$
581             method.addParameter(new Parameter(FullyQualifiedJavaType
582                     .getStringInstance(), "condition")); //$NON-NLS-1$
583             method.addParameter(new Parameter(listOfDates, "values")); //$NON-NLS-1$
584             method.addParameter(new Parameter(FullyQualifiedJavaType
585                     .getStringInstance(), "property")); //$NON-NLS-1$
586             method.addBodyLine("if (values == null || values.size() == 0) {"); //$NON-NLS-1$
587             method
588                     .addBodyLine("throw new RuntimeException(\"Value list for \" + property + \" cannot be null or empty\");"); //$NON-NLS-1$
589             method.addBodyLine("}"); //$NON-NLS-1$
590             method
591                     .addBodyLine("List<java.sql.Date> dateList = new ArrayList<java.sql.Date>();"); //$NON-NLS-1$
592             method.addBodyLine("Iterator<Date> iter = values.iterator();"); //$NON-NLS-1$
593             method.addBodyLine("while (iter.hasNext()) {"); //$NON-NLS-1$
594             method
595                     .addBodyLine("dateList.add(new java.sql.Date(iter.next().getTime()));"); //$NON-NLS-1$
596             method.addBodyLine("}"); //$NON-NLS-1$
597             method.addBodyLine("addCriterion(condition, dateList, property);"); //$NON-NLS-1$
598             answer.addMethod(method);
599 
600             method = new Method();
601             method.setVisibility(JavaVisibility.PROTECTED);
602             method.setName("addCriterionForJDBCDate"); //$NON-NLS-1$
603             method.addParameter(new Parameter(FullyQualifiedJavaType
604                     .getStringInstance(), "condition")); //$NON-NLS-1$
605             method.addParameter(new Parameter(FullyQualifiedJavaType
606                     .getDateInstance(), "value1")); //$NON-NLS-1$
607             method.addParameter(new Parameter(FullyQualifiedJavaType
608                     .getDateInstance(), "value2")); //$NON-NLS-1$
609             method.addParameter(new Parameter(FullyQualifiedJavaType
610                     .getStringInstance(), "property")); //$NON-NLS-1$
611             method.addBodyLine("if (value1 == null || value2 == null) {"); //$NON-NLS-1$
612             method
613                     .addBodyLine("throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");"); //$NON-NLS-1$
614             method.addBodyLine("}"); //$NON-NLS-1$
615             method
616                     .addBodyLine("addCriterion(condition, new java.sql.Date(value1.getTime()), new java.sql.Date(value2.getTime()), property);"); //$NON-NLS-1$
617             answer.addMethod(method);
618         }
619 
620         if (introspectedTable.hasJDBCTimeColumns()) {
621             topLevelClass.addImportedType(FullyQualifiedJavaType
622                     .getDateInstance());
623             topLevelClass.addImportedType(FullyQualifiedJavaType
624                     .getNewIteratorInstance());
625             method = new Method();
626             method.setVisibility(JavaVisibility.PROTECTED);
627             method.setName("addCriterionForJDBCTime"); //$NON-NLS-1$
628             method.addParameter(new Parameter(FullyQualifiedJavaType
629                     .getStringInstance(), "condition")); //$NON-NLS-1$
630             method.addParameter(new Parameter(FullyQualifiedJavaType
631                     .getDateInstance(), "value")); //$NON-NLS-1$
632             method.addParameter(new Parameter(FullyQualifiedJavaType
633                     .getStringInstance(), "property")); //$NON-NLS-1$
634             method.addBodyLine("if (value == null) {"); //$NON-NLS-1$
635             method
636                     .addBodyLine("throw new RuntimeException(\"Value for \" + property + \" cannot be null\");"); //$NON-NLS-1$
637             method.addBodyLine("}"); //$NON-NLS-1$
638             method
639                     .addBodyLine("addCriterion(condition, new java.sql.Time(value.getTime()), property);"); //$NON-NLS-1$
640             answer.addMethod(method);
641 
642             method = new Method();
643             method.setVisibility(JavaVisibility.PROTECTED);
644             method.setName("addCriterionForJDBCTime"); //$NON-NLS-1$
645             method.addParameter(new Parameter(FullyQualifiedJavaType
646                     .getStringInstance(), "condition")); //$NON-NLS-1$
647             method.addParameter(new Parameter(listOfDates, "values")); //$NON-NLS-1$
648             method.addParameter(new Parameter(FullyQualifiedJavaType
649                     .getStringInstance(), "property")); //$NON-NLS-1$
650             method.addBodyLine("if (values == null || values.size() == 0) {"); //$NON-NLS-1$
651             method
652                     .addBodyLine("throw new RuntimeException(\"Value list for \" + property + \" cannot be null or empty\");"); //$NON-NLS-1$
653             method.addBodyLine("}"); //$NON-NLS-1$
654             method
655                     .addBodyLine("List<java.sql.Time> timeList = new ArrayList<java.sql.Time>();"); //$NON-NLS-1$
656             method.addBodyLine("Iterator<Date> iter = values.iterator();"); //$NON-NLS-1$
657             method.addBodyLine("while (iter.hasNext()) {"); //$NON-NLS-1$
658             method
659                     .addBodyLine("timeList.add(new java.sql.Time(iter.next().getTime()));"); //$NON-NLS-1$
660             method.addBodyLine("}"); //$NON-NLS-1$
661             method.addBodyLine("addCriterion(condition, timeList, property);"); //$NON-NLS-1$
662             answer.addMethod(method);
663 
664             method = new Method();
665             method.setVisibility(JavaVisibility.PROTECTED);
666             method.setName("addCriterionForJDBCTime"); //$NON-NLS-1$
667             method.addParameter(new Parameter(FullyQualifiedJavaType
668                     .getStringInstance(), "condition")); //$NON-NLS-1$
669             method.addParameter(new Parameter(FullyQualifiedJavaType
670                     .getDateInstance(), "value1")); //$NON-NLS-1$
671             method.addParameter(new Parameter(FullyQualifiedJavaType
672                     .getDateInstance(), "value2")); //$NON-NLS-1$
673             method.addParameter(new Parameter(FullyQualifiedJavaType
674                     .getStringInstance(), "property")); //$NON-NLS-1$
675             method.addBodyLine("if (value1 == null || value2 == null) {"); //$NON-NLS-1$
676             method
677                     .addBodyLine("throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");"); //$NON-NLS-1$
678             method.addBodyLine("}"); //$NON-NLS-1$
679             method
680                     .addBodyLine("addCriterion(condition, new java.sql.Time(value1.getTime()), new java.sql.Time(value2.getTime()), property);"); //$NON-NLS-1$
681             answer.addMethod(method);
682         }
683 
684         for (IntrospectedColumn introspectedColumn : introspectedTable
685                 .getNonBLOBColumns()) {
686             topLevelClass.addImportedType(introspectedColumn
687                     .getFullyQualifiedJavaType());
688 
689             // here we need to add the individual methods for setting the
690             // conditions for a field
691             answer.addMethod(getSetNullMethod(introspectedColumn));
692             answer.addMethod(getSetNotNullMethod(introspectedColumn));
693             answer.addMethod(getSetEqualMethod(introspectedColumn));
694             answer.addMethod(getSetNotEqualMethod(introspectedColumn));
695             answer.addMethod(getSetGreaterThanMethod(introspectedColumn));
696             answer
697                     .addMethod(getSetGreaterThenOrEqualMethod(introspectedColumn));
698             answer.addMethod(getSetLessThanMethod(introspectedColumn));
699             answer.addMethod(getSetLessThanOrEqualMethod(introspectedColumn));
700 
701             if (introspectedColumn.isJdbcCharacterColumn()) {
702                 answer.addMethod(getSetLikeMethod(introspectedColumn));
703                 answer.addMethod(getSetNotLikeMethod(introspectedColumn));
704             }
705 
706             answer.addMethod(getSetInOrNotInMethod(introspectedColumn, true));
707             answer.addMethod(getSetInOrNotInMethod(introspectedColumn, false));
708             answer.addMethod(getSetBetweenOrNotBetweenMethod(
709                     introspectedColumn, true));
710             answer.addMethod(getSetBetweenOrNotBetweenMethod(
711                     introspectedColumn, false));
712         }
713 
714         return answer;
715     }
716 
717     private Method getSetNullMethod(IntrospectedColumn introspectedColumn) {
718         return getNoValueMethod(introspectedColumn, "IsNull", "is null"); //$NON-NLS-1$ //$NON-NLS-2$
719     }
720 
721     private Method getSetNotNullMethod(IntrospectedColumn introspectedColumn) {
722         return getNoValueMethod(introspectedColumn, "IsNotNull", "is not null"); //$NON-NLS-1$ //$NON-NLS-2$
723     }
724 
725     private Method getSetEqualMethod(IntrospectedColumn introspectedColumn) {
726         return getSingleValueMethod(introspectedColumn, "EqualTo", "="); //$NON-NLS-1$ //$NON-NLS-2$
727     }
728 
729     private Method getSetNotEqualMethod(IntrospectedColumn introspectedColumn) {
730         return getSingleValueMethod(introspectedColumn, "NotEqualTo", "<>"); //$NON-NLS-1$ //$NON-NLS-2$
731     }
732 
733     private Method getSetGreaterThanMethod(IntrospectedColumn introspectedColumn) {
734         return getSingleValueMethod(introspectedColumn, "GreaterThan", ">"); //$NON-NLS-1$ //$NON-NLS-2$
735     }
736 
737     private Method getSetGreaterThenOrEqualMethod(
738             IntrospectedColumn introspectedColumn) {
739         return getSingleValueMethod(introspectedColumn,
740                 "GreaterThanOrEqualTo", ">="); //$NON-NLS-1$ //$NON-NLS-2$
741     }
742 
743     private Method getSetLessThanMethod(IntrospectedColumn introspectedColumn) {
744         return getSingleValueMethod(introspectedColumn, "LessThan", "<"); //$NON-NLS-1$ //$NON-NLS-2$
745     }
746 
747     private Method getSetLessThanOrEqualMethod(
748             IntrospectedColumn introspectedColumn) {
749         return getSingleValueMethod(introspectedColumn,
750                 "LessThanOrEqualTo", "<="); //$NON-NLS-1$ //$NON-NLS-2$
751     }
752 
753     private Method getSetLikeMethod(IntrospectedColumn introspectedColumn) {
754         return getSingleValueMethod(introspectedColumn, "Like", "like"); //$NON-NLS-1$ //$NON-NLS-2$
755     }
756 
757     private Method getSetNotLikeMethod(IntrospectedColumn introspectedColumn) {
758         return getSingleValueMethod(introspectedColumn, "NotLike", "not like"); //$NON-NLS-1$ //$NON-NLS-2$
759     }
760 
761     private Method getSingleValueMethod(IntrospectedColumn introspectedColumn,
762             String nameFragment, String operator) {
763         Method method = new Method();
764         method.setVisibility(JavaVisibility.PUBLIC);
765         method.addParameter(new Parameter(introspectedColumn
766                 .getFullyQualifiedJavaType(), "value")); //$NON-NLS-1$
767         StringBuilder sb = new StringBuilder();
768         sb.append(introspectedColumn.getJavaProperty());
769         sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
770         sb.insert(0, "and"); //$NON-NLS-1$
771         sb.append(nameFragment);
772         method.setName(sb.toString());
773         method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
774         sb.setLength(0);
775 
776         if (introspectedColumn.isJDBCDateColumn()) {
777             sb.append("addCriterionForJDBCDate(\""); //$NON-NLS-1$
778         } else if (introspectedColumn.isJDBCTimeColumn()) {
779             sb.append("addCriterionForJDBCTime(\""); //$NON-NLS-1$
780         } else if (stringHasValue(introspectedColumn
781                 .getTypeHandler())) {
782             sb.append("add"); //$NON-NLS-1$
783             sb.append(introspectedColumn.getJavaProperty());
784             sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
785             sb.append("Criterion(\""); //$NON-NLS-1$
786         } else {
787             sb.append("addCriterion(\""); //$NON-NLS-1$
788         }
789 
790         sb.append(MyBatis3FormattingUtilities
791                 .getAliasedActualColumnName(introspectedColumn));
792         sb.append(' ');
793         sb.append(operator);
794         sb.append("\", "); //$NON-NLS-1$
795         sb.append("value"); //$NON-NLS-1$
796         sb.append(", \""); //$NON-NLS-1$
797         sb.append(introspectedColumn.getJavaProperty());
798         sb.append("\");"); //$NON-NLS-1$
799         method.addBodyLine(sb.toString());
800         method.addBodyLine("return (Criteria) this;"); //$NON-NLS-1$
801 
802         return method;
803     }
804 
805     /**
806      * Generates methods that set between and not between conditions
807      * 
808      * @param introspectedColumn
809      * @param betweenMethod
810      * @return a generated method for the between or not between method
811      */
812     private Method getSetBetweenOrNotBetweenMethod(
813             IntrospectedColumn introspectedColumn, boolean betweenMethod) {
814         Method method = new Method();
815         method.setVisibility(JavaVisibility.PUBLIC);
816         FullyQualifiedJavaType type = introspectedColumn
817                 .getFullyQualifiedJavaType();
818 
819         method.addParameter(new Parameter(type, "value1")); //$NON-NLS-1$
820         method.addParameter(new Parameter(type, "value2")); //$NON-NLS-1$
821         StringBuilder sb = new StringBuilder();
822         sb.append(introspectedColumn.getJavaProperty());
823         sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
824         sb.insert(0, "and"); //$NON-NLS-1$
825         if (betweenMethod) {
826             sb.append("Between"); //$NON-NLS-1$
827         } else {
828             sb.append("NotBetween"); //$NON-NLS-1$
829         }
830         method.setName(sb.toString());
831         method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
832         sb.setLength(0);
833 
834         if (introspectedColumn.isJDBCDateColumn()) {
835             sb.append("addCriterionForJDBCDate(\""); //$NON-NLS-1$
836         } else if (introspectedColumn.isJDBCTimeColumn()) {
837             sb.append("addCriterionForJDBCTime(\""); //$NON-NLS-1$
838         } else if (stringHasValue(introspectedColumn
839                 .getTypeHandler())) {
840             sb.append("add"); //$NON-NLS-1$
841             sb.append(introspectedColumn.getJavaProperty());
842             sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
843             sb.append("Criterion(\""); //$NON-NLS-1$
844         } else {
845             sb.append("addCriterion(\""); //$NON-NLS-1$
846         }
847 
848         sb.append(MyBatis3FormattingUtilities
849                 .getAliasedActualColumnName(introspectedColumn));
850         if (betweenMethod) {
851             sb.append(" between"); //$NON-NLS-1$
852         } else {
853             sb.append(" not between"); //$NON-NLS-1$
854         }
855         sb.append("\", "); //$NON-NLS-1$
856         sb.append("value1, value2"); //$NON-NLS-1$
857         sb.append(", \""); //$NON-NLS-1$
858         sb.append(introspectedColumn.getJavaProperty());
859         sb.append("\");"); //$NON-NLS-1$
860         method.addBodyLine(sb.toString());
861         method.addBodyLine("return (Criteria) this;"); //$NON-NLS-1$
862 
863         return method;
864     }
865 
866     /**
867      * 
868      * @param introspectedColumn
869      * @param inMethod
870      *            if true generates an "in" method, else generates a "not in"
871      *            method
872      * @return a generated method for the in or not in method
873      */
874     private Method getSetInOrNotInMethod(IntrospectedColumn introspectedColumn,
875             boolean inMethod) {
876         Method method = new Method();
877         method.setVisibility(JavaVisibility.PUBLIC);
878         FullyQualifiedJavaType type = FullyQualifiedJavaType
879                 .getNewListInstance();
880         if (introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) {
881             type.addTypeArgument(introspectedColumn.getFullyQualifiedJavaType()
882                     .getPrimitiveTypeWrapper());
883         } else {
884             type
885                     .addTypeArgument(introspectedColumn
886                             .getFullyQualifiedJavaType());
887         }
888 
889         method.addParameter(new Parameter(type, "values")); //$NON-NLS-1$
890         StringBuilder sb = new StringBuilder();
891         sb.append(introspectedColumn.getJavaProperty());
892         sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
893         sb.insert(0, "and"); //$NON-NLS-1$
894         if (inMethod) {
895             sb.append("In"); //$NON-NLS-1$
896         } else {
897             sb.append("NotIn"); //$NON-NLS-1$
898         }
899         method.setName(sb.toString());
900         method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
901         sb.setLength(0);
902 
903         if (introspectedColumn.isJDBCDateColumn()) {
904             sb.append("addCriterionForJDBCDate(\""); //$NON-NLS-1$
905         } else if (introspectedColumn.isJDBCTimeColumn()) {
906             sb.append("addCriterionForJDBCTime(\""); //$NON-NLS-1$
907         } else if (stringHasValue(introspectedColumn
908                 .getTypeHandler())) {
909             sb.append("add"); //$NON-NLS-1$
910             sb.append(introspectedColumn.getJavaProperty());
911             sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
912             sb.append("Criterion(\""); //$NON-NLS-1$
913         } else {
914             sb.append("addCriterion(\""); //$NON-NLS-1$
915         }
916 
917         sb.append(MyBatis3FormattingUtilities
918                 .getAliasedActualColumnName(introspectedColumn));
919         if (inMethod) {
920             sb.append(" in"); //$NON-NLS-1$
921         } else {
922             sb.append(" not in"); //$NON-NLS-1$
923         }
924         sb.append("\", values, \""); //$NON-NLS-1$
925         sb.append(introspectedColumn.getJavaProperty());
926         sb.append("\");"); //$NON-NLS-1$
927         method.addBodyLine(sb.toString());
928         method.addBodyLine("return (Criteria) this;"); //$NON-NLS-1$
929 
930         return method;
931     }
932 
933     private Method getNoValueMethod(IntrospectedColumn introspectedColumn,
934             String nameFragment, String operator) {
935         Method method = new Method();
936         method.setVisibility(JavaVisibility.PUBLIC);
937         StringBuilder sb = new StringBuilder();
938         sb.append(introspectedColumn.getJavaProperty());
939         sb.setCharAt(0, Character.toUpperCase(sb.charAt(0)));
940         sb.insert(0, "and"); //$NON-NLS-1$
941         sb.append(nameFragment);
942         method.setName(sb.toString());
943         method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance());
944         sb.setLength(0);
945         sb.append("addCriterion(\""); //$NON-NLS-1$
946         sb.append(MyBatis3FormattingUtilities
947                 .getAliasedActualColumnName(introspectedColumn));
948         sb.append(' ');
949         sb.append(operator);
950         sb.append("\");"); //$NON-NLS-1$
951         method.addBodyLine(sb.toString());
952         method.addBodyLine("return (Criteria) this;"); //$NON-NLS-1$
953 
954         return method;
955     }
956 
957     /**
958      * This method adds all the extra methods and fields required to support a
959      * user defined type handler on some column.
960      * 
961      * @param introspectedColumn
962      * @param constructor
963      * @param innerClass
964      * @return the name of the List added to the class by this method
965      */
966     private String addtypeHandledObjectsAndMethods(
967             IntrospectedColumn introspectedColumn, Method constructor,
968             InnerClass innerClass) {
969         String answer;
970         StringBuilder sb = new StringBuilder();
971 
972         // add new private field and public accessor in the class
973         sb.setLength(0);
974         sb.append(introspectedColumn.getJavaProperty());
975         sb.append("Criteria"); //$NON-NLS-1$
976         answer = sb.toString();
977 
978         Field field = new Field();
979         field.setVisibility(JavaVisibility.PROTECTED);
980         field.setType(new FullyQualifiedJavaType("java.util.List<Criterion>")); //$NON-NLS-1$
981         field.setName(answer);
982         innerClass.addField(field);
983 
984         Method method = new Method();
985         method.setVisibility(JavaVisibility.PUBLIC);
986         method.setReturnType(field.getType());
987         method.setName(getGetterMethodName(field.getName(), field
988                 .getType()));
989         sb.insert(0, "return "); //$NON-NLS-1$
990         sb.append(';');
991         method.addBodyLine(sb.toString());
992         innerClass.addMethod(method);
993 
994         // add constructor initialization
995         sb.setLength(0);
996         sb.append(field.getName());
997         sb.append(" = new ArrayList<Criterion>();"); //$NON-NLS-1$;
998         constructor.addBodyLine(sb.toString());
999 
1000         // now add the methods for simplifying the individual field set methods
1001         method = new Method();
1002         method.setVisibility(JavaVisibility.PROTECTED);
1003         sb.setLength(0);
1004         sb.append("add"); //$NON-NLS-1$
1005         sb.append(introspectedColumn.getJavaProperty());
1006         sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
1007         sb.append("Criterion"); //$NON-NLS-1$
1008 
1009         method.setName(sb.toString());
1010         method.addParameter(new Parameter(FullyQualifiedJavaType
1011                 .getStringInstance(), "condition")); //$NON-NLS-1$
1012         method.addParameter(new Parameter(FullyQualifiedJavaType
1013                 .getObjectInstance(), "value")); //$NON-NLS-1$
1014         method.addParameter(new Parameter(FullyQualifiedJavaType
1015                 .getStringInstance(), "property")); //$NON-NLS-1$
1016         method.addBodyLine("if (value == null) {"); //$NON-NLS-1$
1017         method
1018                 .addBodyLine("throw new RuntimeException(\"Value for \" + property + \" cannot be null\");"); //$NON-NLS-1$
1019         method.addBodyLine("}"); //$NON-NLS-1$
1020 
1021         method.addBodyLine(
1022                 String.format("%s.add(new Criterion(condition, value, \"%s\"));", //$NON-NLS-1$
1023                         field.getName(), introspectedColumn.getTypeHandler()));
1024         method.addBodyLine("allCriteria = null;"); //$NON-NLS-1$
1025         innerClass.addMethod(method);
1026 
1027         sb.setLength(0);
1028         sb.append("add"); //$NON-NLS-1$
1029         sb.append(introspectedColumn.getJavaProperty());
1030         sb.setCharAt(3, Character.toUpperCase(sb.charAt(3)));
1031         sb.append("Criterion"); //$NON-NLS-1$
1032 
1033         method = new Method();
1034         method.setVisibility(JavaVisibility.PROTECTED);
1035         method.setName(sb.toString());
1036         method.addParameter(new Parameter(FullyQualifiedJavaType
1037                 .getStringInstance(), "condition")); //$NON-NLS-1$
1038         method.addParameter(new Parameter(introspectedColumn
1039                 .getFullyQualifiedJavaType(), "value1")); //$NON-NLS-1$
1040         method.addParameter(new Parameter(introspectedColumn
1041                 .getFullyQualifiedJavaType(), "value2")); //$NON-NLS-1$
1042         method.addParameter(new Parameter(FullyQualifiedJavaType
1043                 .getStringInstance(), "property")); //$NON-NLS-1$
1044         if (!introspectedColumn.getFullyQualifiedJavaType().isPrimitive()) {
1045             method.addBodyLine("if (value1 == null || value2 == null) {"); //$NON-NLS-1$
1046             method
1047                 .addBodyLine("throw new RuntimeException(\"Between values for \" + property + \" cannot be null\");"); //$NON-NLS-1$
1048             method.addBodyLine("}"); //$NON-NLS-1$
1049         }
1050 
1051         method.addBodyLine(
1052                 String.format("%s.add(new Criterion(condition, value1, value2, \"%s\"));", //$NON-NLS-1$
1053                         field.getName(), introspectedColumn.getTypeHandler()));
1054         
1055         method.addBodyLine("allCriteria = null;"); //$NON-NLS-1$
1056         innerClass.addMethod(method);
1057 
1058         return answer;
1059     }
1060 }