PlainSelect и SetOperationList в анализаторе jsql
В чем разница между PlainSelect и SetOperationList в парсере jsql
2 ответа
PlainSelect представляет простой оператор выбора, например:
SELECT * FROM mytable
в то время как SetOperationList представляет операцию набора, используя несколько элементов PlainSelect( https://en.wikipedia.org/wiki/Set_operations_(SQL)).
SELECT a FROM mytable
UNION
SELECT b FROM mytable2
Понижение не в порядке, из-за пропущенных javadocs для этого класса.
По сути, при их анализе в JSQLParser следует помнить, что если это SetOperationList (т.е. с использованием UNION INTERSECT и т. д.), его нужно анализировать по-другому.
selectTableStatement.getSelectBody().getClass().getSimpleName().equals("PlainSelect")
является ключевым
Ошибка, возникающая при анализе их как одинаковых,net.sf.jsqlparser.statement.select.SetOperationList cannot be cast to net.sf.jsqlparser.statement.select.PlainSelect
private static List<String> extractSelectTableSelectItems(Select selectTableStatement){
List<String> fields = new ArrayList<>();
if(selectTableStatement.getSelectBody().getClass().getSimpleName().equals("PlainSelect")) {
PlainSelect plainSelect = (PlainSelect) selectTableStatement.getSelectBody();
List<SelectItem> selectItems = plainSelect.getSelectItems();
for(SelectItem selectItem : selectItems) {
fields.add(selectItem.toString());
}
} else if(selectTableStatement.getSelectBody().getClass().getSimpleName().equals("SetOperationList")) {
SetOperationList setOperationList = (SetOperationList) selectTableStatement.getSelectBody();
List<SelectBody> selectBodyList = setOperationList.getSelects();
for(SelectBody selectBody: selectBodyList) {
PlainSelect plainSelect = (PlainSelect) selectBody;
List<SelectItem> selectItems = plainSelect.getSelectItems();
for(SelectItem selectItem : selectItems) {
fields.add(selectItem.toString());
}
}
}
return fields;
}