package jef.database.jsqlparser; import java.util.HashMap; import java.util.Map; import jef.common.Pair; import jef.database.dialect.DatabaseDialect; import jef.database.dialect.type.ColumnMapping; import jef.database.jsqlparser.expression.Column; import jef.database.jsqlparser.statement.insert.Insert; import jef.database.jsqlparser.statement.update.Update; import jef.database.jsqlparser.visitor.Expression; import jef.database.jsqlparser.visitor.VisitorAdapter; import jef.database.meta.ITableMetadata; import org.springframework.util.Assert; /** * 将JPQL的SELECT语句解析为标准SQL 目前其实并不是真正的JPQL支持,只能将查询中出现的字段名和类名更改为对应的表名和列名而已。 * 因此实际上并不常用。 * * @author Administrator 这个实现好像问题不少,尽量避免再用 */ public final class JPQLConvert extends VisitorAdapter { private DatabaseDialect dialect; private ITableMetadata meta; private FromCollector from = new FromCollector(dialect); public JPQLConvert(DatabaseDialect profile) { this.dialect = profile; } static Map<String, Class<?>> cache = new HashMap<String, Class<?>>(); public void visit(Insert insert) { insert.getTable().accept(from); meta = from.aliasMap.get(insert.getTable().getAlias()); Assert.notNull(meta); for (Column column : insert.getColumns()) { ColumnMapping fld = meta.findField(column.getColumnName()); if (meta == null) continue; column.setColumnName(fld.getColumnName(dialect, true)); } } public void visit(Update update) { update.getTable().accept(from); meta = from.aliasMap.get(update.getTable().getAlias()); Assert.notNull(meta); for (Pair<Column, Expression> pair : update.getSets()) { Column col = pair.getFirst(); ColumnMapping fld = meta.findField(col.getColumnName()); if (meta == null) continue; col.setColumnName(fld.getColumnName(dialect, true)); } update.getWhere().accept(this); } @Override public void visit(Column tableColumn) { String tbAlias = tableColumn.getTableAlias(); String col = tableColumn.getColumnName(); ITableMetadata cc = null; if (tbAlias == null) { for (ITableMetadata meta : from.aliasMap.values()) { if (meta == null) continue; ColumnMapping fld = meta.findField(col); if (fld == null) continue; tableColumn.setColumnName(fld.getColumnName(dialect, true)); } } else { cc = from.aliasMap.get(tbAlias); if (cc == null) return; ColumnMapping fld = cc.findField(col); if (fld == null) return; tableColumn.setColumnName(fld.getColumnName(dialect, true)); } super.visit(tableColumn); } }