use of net.sf.jsqlparser.schema.Column in project JSqlParser by JSQLParser.
the class UpsertDeParser method appendDuplicate.
private void appendDuplicate(Upsert upsert) {
buffer.append(" ON DUPLICATE KEY UPDATE ");
for (int i = 0; i < upsert.getDuplicateUpdateColumns().size(); i++) {
Column column = upsert.getDuplicateUpdateColumns().get(i);
buffer.append(column.getFullyQualifiedName()).append(" = ");
Expression expression = upsert.getDuplicateUpdateExpressionList().get(i);
expression.accept(expressionVisitor);
if (i < upsert.getDuplicateUpdateColumns().size() - 1) {
buffer.append(", ");
}
}
}
use of net.sf.jsqlparser.schema.Column in project Mybatis-PageHelper by pagehelper.
the class SqlServerParser method getSelectItems.
/**
* 获取查询列
*
* @param plainSelect
* @return
*/
protected List<SelectItem> getSelectItems(PlainSelect plainSelect) {
// 设置selectItems
List<SelectItem> selectItems = new ArrayList<SelectItem>();
for (SelectItem selectItem : plainSelect.getSelectItems()) {
// 别名需要特殊处理
if (selectItem instanceof SelectExpressionItem) {
SelectExpressionItem selectExpressionItem = (SelectExpressionItem) selectItem;
if (selectExpressionItem.getAlias() != null) {
// 直接使用别名
Column column = new Column(selectExpressionItem.getAlias().getName());
SelectExpressionItem expressionItem = new SelectExpressionItem(column);
selectItems.add(expressionItem);
} else if (selectExpressionItem.getExpression() instanceof Column) {
Column column = (Column) selectExpressionItem.getExpression();
SelectExpressionItem item = null;
if (column.getTable() != null) {
Column newColumn = new Column(column.getColumnName());
item = new SelectExpressionItem(newColumn);
selectItems.add(item);
} else {
selectItems.add(selectItem);
}
} else {
selectItems.add(selectItem);
}
} else if (selectItem instanceof AllTableColumns) {
selectItems.add(new AllColumns());
} else {
selectItems.add(selectItem);
}
}
// SELECT *, alias FROM (SELECT *, 1 AS alias FROM TEST)
for (SelectItem selectItem : selectItems) {
if (selectItem instanceof AllColumns) {
return Collections.singletonList(selectItem);
}
}
return selectItems;
}
use of net.sf.jsqlparser.schema.Column in project Mybatis-PageHelper by pagehelper.
the class SqlServerParser method addRowNumber.
/**
* 获取 ROW_NUMBER() 列
*
* @param plainSelect 原查询
* @param autoItems 自动生成的查询列
* @return ROW_NUMBER() 列
*/
protected SelectItem addRowNumber(PlainSelect plainSelect, List<SelectItem> autoItems) {
// 增加ROW_NUMBER()
StringBuilder orderByBuilder = new StringBuilder();
orderByBuilder.append("ROW_NUMBER() OVER (");
if (isNotEmptyList(plainSelect.getOrderByElements())) {
orderByBuilder.append(PlainSelect.orderByToString(getOrderByElements(plainSelect, autoItems)).substring(1));
// 清空排序列表
plainSelect.setOrderByElements(null);
} else {
orderByBuilder.append("ORDER BY RAND()");
}
orderByBuilder.append(") ");
orderByBuilder.append(PAGE_ROW_NUMBER);
return new SelectExpressionItem(new Column(orderByBuilder.toString()));
}
use of net.sf.jsqlparser.schema.Column 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 为普通列
Table table = ((Column) expression).getTable();
if (table == null) {
// 表名为空
if (allColumns || (allColumnsTables.size() == 1 && plainSelect.getJoins() == null) || aliases.contains(((Column) expression).getColumnName())) {
// 此时排序列其实已经包含在查询列表中了,不需做任何操作
continue;
}
} else {
// 表名不为空
String tableName = table.getName();
if (allColumns || allColumnsTables.contains(tableName)) {
// 包含`*`查询列 或者 包含特定的`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;
}
use of net.sf.jsqlparser.schema.Column in project spanner-jdbc by olavloite.
the class CloudSpannerResultSetMetaData method isNullable.
@Override
public int isNullable(int column) throws SQLException {
Column col = getColumn(column);
if (col != null && col.getTable() != null) {
String schema = Strings.isNullOrEmpty(col.getTable().getSchemaName()) ? "" : CloudSpannerDriver.unquoteIdentifier(col.getTable().getSchemaName());
String tableName = CloudSpannerDriver.unquoteIdentifier(col.getTable().getName());
String colName = CloudSpannerDriver.unquoteIdentifier(col.getColumnName());
try (java.sql.ResultSet rs = statement.getConnection().getMetaData().getColumns("", schema, tableName, colName)) {
if (rs.next()) {
return rs.getInt("NULLABLE");
}
}
}
return columnNullableUnknown;
}
Aggregations