package jef.database.jsqlparser;
import jef.database.dialect.DatabaseDialect;
import jef.database.dialect.type.ColumnMapping;
import jef.database.jsqlparser.expression.Column;
import jef.database.jsqlparser.statement.select.PlainSelect;
import jef.database.jsqlparser.visitor.SelectItem;
import jef.database.jsqlparser.visitor.VisitorAdapter;
import jef.database.meta.ITableMetadata;
/**
* 将JPQL的SELECT语句解析为标准SQL 目前其实并不是真正的JPQL支持,只能将查询中出现的字段名和类名更改为对应的表名和列名而已。
* 因此实际上并不常用。
*
* @author Administrator 这个实现好像问题不少,尽量避免再用
*/
public final class JPQLSelectConvert extends VisitorAdapter {
private DatabaseDialect profile;
public JPQLSelectConvert(DatabaseDialect profile) {
this.profile = profile;
}
private final FromCollector fromCollector = new FromCollector(profile) ;
public void visit(PlainSelect plainSelect) {
plainSelect.getFromItem().accept(fromCollector);
// 再解析Join
if (plainSelect.getJoins() != null) {
for (jef.database.jsqlparser.statement.select.Join jj : plainSelect.getJoins()) {
jj.getRightItem().accept(fromCollector);
if (jj.getOnExpression() != null)
jj.getOnExpression().accept(this);
if (jj.getUsingColumns() != null) {
for (Column c : jj.getUsingColumns()) {
c.accept(this);
}
}
}
}
// 先解析From
for (SelectItem s : plainSelect.getSelectItems()) {
s.accept(this);
}
if (plainSelect.getWhere() != null)
plainSelect.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 : fromCollector.aliasMap.values()) {
if (meta == null)
continue;
ColumnMapping fld = meta.findField(col);
if (fld == null)
continue;
tableColumn.setColumnName(fld.getColumnName(profile, true));
}
} else {
cc = fromCollector.aliasMap.get(tbAlias);
if (cc == null)
return;
ColumnMapping fld = cc.findField(col);
if (fld == null)
return;
tableColumn.setColumnName(fld.getColumnName(profile, true));
}
super.visit(tableColumn);
}
}