This Ibator plugin adds setLimitClause() method to example class.
import java.util.Iterator;
import java.util.List;
import org.apache.ibatis.ibator.api.IbatorPluginAdapter;
import org.apache.ibatis.ibator.api.IntrospectedTable;
import org.apache.ibatis.ibator.api.dom.java.Field;
import org.apache.ibatis.ibator.api.dom.java.FullyQualifiedJavaType;
import org.apache.ibatis.ibator.api.dom.java.JavaVisibility;
import org.apache.ibatis.ibator.api.dom.java.Method;
import org.apache.ibatis.ibator.api.dom.java.Parameter;
import org.apache.ibatis.ibator.api.dom.java.TopLevelClass;
import org.apache.ibatis.ibator.api.dom.xml.Attribute;
import org.apache.ibatis.ibator.api.dom.xml.Element;
import org.apache.ibatis.ibator.api.dom.xml.TextElement;
import org.apache.ibatis.ibator.api.dom.xml.XmlElement;
public class AddLimitClausePlugin extends IbatorPluginAdapter
{
  public boolean validate(List<String> warnings)
  {
    return true;
  }
  @Override
  public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
    IntrospectedTable introspectedTable)
  {
    Iterator<Method> it = topLevelClass.getMethods().iterator();
    while (it.hasNext())
    {
      Method m = it.next();
      // This logic will be broken if another constructor is added
      if (m.isConstructor() && m.getParameters() != null && m.getParameters().size() > 0)
      {
        m.addBodyLine("this.limitClause = example.limitClause;");
      }
    }
    // add field, getter, setter for limit clause
    Field field = new Field();
    field.setVisibility(JavaVisibility.PROTECTED);
    field.setType(FullyQualifiedJavaType.getStringInstance());
    field.setName("limitClause");
    ibatorContext.getCommentGenerator().addFieldComment(field,
      introspectedTable.getFullyQualifiedTable());
    topLevelClass.addField(field);
    Method method = new Method();
    method.setVisibility(JavaVisibility.PUBLIC);
    method.setName("setLimitClause");
    method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(),
      "limitClause"));
    method.addBodyLine("this.limitClause = limitClause;");
    ibatorContext.getCommentGenerator().addGeneralMethodComment(method,
      introspectedTable.getFullyQualifiedTable());
    topLevelClass.addMethod(method);
    method = new Method();
    method.setVisibility(JavaVisibility.PUBLIC);
    method.setReturnType(FullyQualifiedJavaType.getStringInstance());
    method.setName("getLimitClause");
    method.addBodyLine("return limitClause;");
    ibatorContext.getCommentGenerator().addGeneralMethodComment(method,
      introspectedTable.getFullyQualifiedTable());
    topLevelClass.addMethod(method);
    return true;
  }
  @Override
  public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element,
    IntrospectedTable introspectedTable)
  {
    Iterator<Element> it = element.getElements().iterator();
    while (it.hasNext())
    {
      Element elem = it.next();
      if (elem instanceof XmlElement)
      {
        XmlElement xmlElem = (XmlElement)elem;
        if ("isParameterPresent".equals(xmlElem.getName()))
        {
          XmlElement isNotNullElement = new XmlElement("isNotNull");
          isNotNullElement.addAttribute(new Attribute("property", "limitClause"));
          isNotNullElement.addElement(new TextElement("limit $limitClause$"));
          xmlElem.addElement(isNotNullElement);
        }
      }
    }
    return true;
  }
}
For example, to display 10 results from offset 15, you can write as follows.
- MySQL
PersonExample example = new PersonExample();
// other conditions...
example.setLimitClause("15, 10");
- PostgreSQL
PersonExample example = new PersonExample();
// other conditions...
example.setLimitClause("10 offset 15");
No comments:
Post a Comment