package jef.database.jsqlparser; import java.io.StringReader; import java.util.HashMap; import java.util.Map; import jef.common.log.LogUtil; import jef.database.dialect.DatabaseDialect; import jef.database.jsqlparser.expression.JpqlParameter; import jef.database.jsqlparser.expression.Table; import jef.database.jsqlparser.parser.JpqlParser; import jef.database.jsqlparser.parser.ParseException; import jef.database.jsqlparser.statement.select.AllColumns; import jef.database.jsqlparser.statement.select.AllTableColumns; import jef.database.jsqlparser.statement.select.Join; import jef.database.jsqlparser.statement.select.Limit; import jef.database.jsqlparser.statement.select.OrderBy; import jef.database.jsqlparser.statement.select.OrderByElement; import jef.database.jsqlparser.statement.select.SelectExpressionItem; import jef.database.jsqlparser.statement.select.SubJoin; import jef.database.jsqlparser.statement.select.SubSelect; import jef.database.jsqlparser.visitor.FromItem; import jef.database.jsqlparser.visitor.SelectItemVisitor; import jef.database.meta.ITableMetadata; import jef.database.meta.MetaHolder; public final class FromCollector implements SelectItemVisitor { // 转换缓存 static Map<String, ITableMetadata> cache = new HashMap<String, ITableMetadata>(); public final Map<String, ITableMetadata> aliasMap = new HashMap<String, ITableMetadata>(); private DatabaseDialect dialect; public FromCollector(DatabaseDialect dialect) { this.dialect = dialect; } private ITableMetadata parseSimpleName(String simpleEntityName) { String key = simpleEntityName.toLowerCase(); ITableMetadata clz = cache.get(key); if (clz == null) { clz = findClass(simpleEntityName); } if (clz == null) return null; cache.put(key, clz); return clz; } private ITableMetadata findClass(String simpleEntityName) { for (ITableMetadata c : MetaHolder.getCachedModels()) { if (c.getSimpleName().equalsIgnoreCase(simpleEntityName)) { // if(clz!=null){ // throw new // IllegalArgumentException("Duplicate class with same name:" // + // simpleEntityName+". between"+clz.getName()+" and "+c.getName()); // } return c; } } LogUtil.warn("the " + simpleEntityName + " does't match any known entity class."); return null; } public void visit(Table tableName) { String t = tableName.getName(); ITableMetadata c; if (t.indexOf('.') > 0) { try { Class<?> clz = Class.forName(t); c = MetaHolder.getMeta(clz); } catch (ClassNotFoundException e) { throw new IllegalArgumentException(e.getMessage()); } } else { c = parseSimpleName(t); } if (c == null) { throw new IllegalArgumentException("Entity not found in SQL: '" + t + "'"); } tableName.setName(c.getTableName(true)); aliasMap.put(tableName.getAlias(), c); } public void visit(SubSelect subSelect) { subSelect.getSelectBody().accept(new JPQLSelectConvert(dialect)); } public void visit(SubJoin subjoin) { subjoin.getLeft().accept(this); subjoin.getJoin().accept(this); } public void visit(JpqlParameter tableClip) { String tablename = tableClip.toString(); if ("?".equals(tablename)) { throw new RuntimeException("Not a valid table"); } JpqlParser p = new JpqlParser(new StringReader(tablename)); try { FromItem item = p.FromItem(); item.accept(this); } catch (ParseException e) { LogUtil.exception(e); } } public void visit(AllColumns allColumns) { } public void visit(AllTableColumns allTableColumns) { } public void visit(SelectExpressionItem selectExpressionItem) { } public void visit(OrderByElement orderBy) { } public void visit(OrderBy orderBy) { } public void visit(Join join) { join.getRightItem().accept(this); } public void visit(Limit limit) { } }