Ibator's deleteByExample() and MySQL.

If you use 'alias' when generating Ibator artifacts and your database is MySQL, you cannot use deleteByExample() because of MySQL bug #12811.
To workaround the issue, you can use the following plugin.

import java.util.List;

import org.apache.ibatis.ibator.api.FullyQualifiedTable;
import org.apache.ibatis.ibator.api.IbatorPluginAdapter;
import org.apache.ibatis.ibator.api.IntrospectedTable;
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 MySqlDeleteByExamplePlugin extends IbatorPluginAdapter

 public boolean validate(List<String> warnings)
  return true;

 public boolean sqlMapDeleteByExampleElementGenerated(XmlElement element,
  IntrospectedTable introspectedTable)
  FullyQualifiedTable table = introspectedTable.getFullyQualifiedTable();
  for (int i = 0; i < element.getElements().size(); i++)
   Element elem = element.getElements().get(i);
   if (elem instanceof TextElement
    && elem.getFormattedContent(0).contains("delete from "))
    replaceDeleteStatement(element, table, i);
  return true;

 private void replaceDeleteStatement(XmlElement element, FullyQualifiedTable table, int index)
  StringBuilder sb = new StringBuilder();
  sb.append("delete from ");
  String alias = table.getAlias();
  if (alias != null && alias.length() > 0)
   sb.append(" using ");

  element.getElements().set(index, new TextElement(sb.toString()));

No comments:

Post a Comment