Search in sources :

Example 1 with Alias

use of net.sf.jsqlparser.expression.Alias in project Mybatis-PageHelper by pagehelper.

the class SqlServerParser method getOrderByElements.

/**
     * 获取新的排序列表
     *
     * @param plainSelect 原始查询
     * @param autoItems   生成的新查询要素
     * @return 新的排序列表
     */
protected List<OrderByElement> getOrderByElements(PlainSelect plainSelect, List<SelectItem> autoItems) {
    List<OrderByElement> orderByElements = plainSelect.getOrderByElements();
    ListIterator<OrderByElement> iterator = orderByElements.listIterator();
    OrderByElement orderByElement;
    // 非 `*` 且 非 `t.*` 查询列集合
    Map<String, SelectExpressionItem> selectMap = new HashMap<String, SelectExpressionItem>();
    // 别名集合
    Set<String> aliases = new HashSet<String>();
    // 是否包含 `*` 查询列
    boolean allColumns = false;
    // `t.*` 查询列的表名集合
    Set<String> allColumnsTables = new HashSet<String>();
    for (SelectItem item : plainSelect.getSelectItems()) {
        if (item instanceof SelectExpressionItem) {
            SelectExpressionItem expItem = (SelectExpressionItem) item;
            selectMap.put(expItem.getExpression().toString(), expItem);
            Alias alias = expItem.getAlias();
            if (alias != null) {
                aliases.add(alias.getName());
            }
        } else if (item instanceof AllColumns) {
            allColumns = true;
        } else if (item instanceof AllTableColumns) {
            allColumnsTables.add(((AllTableColumns) item).getTable().getName());
        }
    }
    // 开始遍历 OrderByElement 列表
    int aliasNo = 1;
    while (iterator.hasNext()) {
        orderByElement = iterator.next();
        Expression expression = orderByElement.getExpression();
        SelectExpressionItem selectExpressionItem = selectMap.get(expression.toString());
        if (selectExpressionItem != null) {
            // OrderByElement 在查询列表中
            Alias alias = selectExpressionItem.getAlias();
            if (alias != null) {
                // 查询列含有别名时用查询列别名
                iterator.set(cloneOrderByElement(orderByElement, alias.getName()));
            } else {
                // 查询列不包含别名
                if (expression instanceof Column) {
                    // 查询列为普通列,这时因为列在嵌套查询外时名称中不包含表名,故去除排序列的表名引用
                    // 例(仅为解释此处逻辑,不代表最终分页结果):
                    // SELECT TEST.A FROM TEST ORDER BY TEST.A
                    // -->
                    // SELECT A FROM (SELECT TEST.A FROM TEST) ORDER BY A
                    ((Column) expression).setTable(null);
                } else {
                    // 而为列增加别名是非常简单的,故此要求排序复杂列必须使用别名
                    throw new PageException("列 \"" + expression + "\" 需要定义别名");
                }
            }
        } else {
            // OrderByElement 不在查询列表中,需要自动生成一个查询列
            if (expression instanceof Column) {
                // OrderByElement 为普通列
                String table = ((Column) expression).getTable().getName();
                if (table == null) {
                    // 表名为空
                    if (allColumns || (allColumnsTables.size() == 1 && plainSelect.getJoins() == null) || aliases.contains(((Column) expression).getColumnName())) {
                        // 此时排序列其实已经包含在查询列表中了,不需做任何操作
                        continue;
                    }
                } else {
                    //表名不为空
                    if (allColumns || allColumnsTables.contains(table)) {
                        // 包含`*`查询列 或者 包含特定的`t.*`列
                        // 此时排序列其实已经包含在查询列表中了,只需去除排序列的表名引
                        ((Column) expression).setTable(null);
                        continue;
                    }
                }
            }
            // 将排序列加入查询列中
            String aliasName = PAGE_COLUMN_ALIAS_PREFIX + aliasNo++;
            SelectExpressionItem item = new SelectExpressionItem();
            item.setExpression(expression);
            item.setAlias(new Alias(aliasName));
            autoItems.add(item);
            iterator.set(cloneOrderByElement(orderByElement, aliasName));
        }
    }
    return orderByElements;
}
Also used : PageException(com.github.pagehelper.PageException) Expression(net.sf.jsqlparser.expression.Expression) Column(net.sf.jsqlparser.schema.Column) Alias(net.sf.jsqlparser.expression.Alias)

Example 2 with Alias

use of net.sf.jsqlparser.expression.Alias in project Mybatis-PageHelper by pagehelper.

the class SqlServerParser method wrapSetOperationList.

/**
     * 包装SetOperationList
     *
     * @param setOperationList
     * @return
     */
protected SelectBody wrapSetOperationList(SetOperationList setOperationList) {
    //获取最后一个plainSelect
    SelectBody setSelectBody = setOperationList.getSelects().get(setOperationList.getSelects().size() - 1);
    if (!(setSelectBody instanceof PlainSelect)) {
        throw new PageException("目前无法处理该SQL,您可以将该SQL发送给abel533@gmail.com协助作者解决!");
    }
    PlainSelect plainSelect = (PlainSelect) setSelectBody;
    PlainSelect selectBody = new PlainSelect();
    List<SelectItem> selectItems = getSelectItems(plainSelect);
    selectBody.setSelectItems(selectItems);
    //设置fromIterm
    SubSelect fromItem = new SubSelect();
    fromItem.setSelectBody(setOperationList);
    fromItem.setAlias(new Alias(WRAP_TABLE));
    selectBody.setFromItem(fromItem);
    //order by
    if (isNotEmptyList(plainSelect.getOrderByElements())) {
        selectBody.setOrderByElements(plainSelect.getOrderByElements());
        plainSelect.setOrderByElements(null);
    }
    return selectBody;
}
Also used : PageException(com.github.pagehelper.PageException) Alias(net.sf.jsqlparser.expression.Alias)

Aggregations

PageException (com.github.pagehelper.PageException)2 Alias (net.sf.jsqlparser.expression.Alias)2 Expression (net.sf.jsqlparser.expression.Expression)1 Column (net.sf.jsqlparser.schema.Column)1