如何用JSQLParser解析Insert后紧跟select scope_identity()的SQL语句
解决JSQLParser解析Hibernate生成的Insert+Select SQL问题
针对你遇到的JSQLParser无法解析insert ... select scope_identity()这类SQL Server特有的语句的问题,可以通过以下几种方式修改代码:
1. 解析为多语句集合(推荐)
Hibernate生成的这条语句本质是SQL Server的批处理语句,包含Insert和Select两个独立语句。JSQLParser的parseStatements方法可以解析多语句集合,修改代码逻辑如下:
import net.sf.jsqlparser.statement.Statement; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.util.CCJSqlParserUtil; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.statement.StatementList; // 替换原有的InsertParser处理逻辑 try { // 解析整个SQL为语句列表 StatementList stmtList = CCJSqlParserUtil.parseStatements(yourSqlString); for (Statement stmt : stmtList.getStatements()) { if (stmt instanceof Insert) { Insert insertStmt = (Insert) stmt; // 处理Insert语句逻辑,比如获取表名、字段、参数等 } else if (stmt instanceof Select) { Select selectStmt = (Select) stmt; // 可选:处理select scope_identity(),比如确认是获取自增ID的语句 } } } catch (JSQLParserException e) { // 异常处理逻辑 }
如果你的SQL没有分号分隔导致解析失败,可以先预处理SQL,在Insert和Select之间插入分号:
// 针对Hibernate生成的特定格式SQL做预处理 if (yourSqlString.toLowerCase().contains("insert") && yourSqlString.toLowerCase().contains("select scope_identity()")) { yourSqlString = yourSqlString.replace(") select scope_identity()", "); select scope_identity()"); }
2. 启用SQL Server方言支持
如果使用的是JSQLParser 4.x及以上版本,可以启用SQL Server方言配置,让解析器更好地兼容SQL Server特有的语法:
import net.sf.jsqlparser.parser.ParserConfiguration; ParserConfiguration config = ParserConfiguration.builder() .setSqlServer(true) // 启用SQL Server方言 .build(); StatementList stmtList = CCJSqlParserUtil.parseStatements(yourSqlString, config);
3. 截断SQL只解析Insert部分(临时方案)
如果不需要处理后面的Select语句,可以直接截断SQL到Insert结束的位置:
// 找到select scope_identity()的起始位置,截断前面的Insert部分 int selectPos = yourSqlString.toLowerCase().indexOf("select scope_identity()"); if (selectPos != -1) { String insertSql = yourSqlString.substring(0, selectPos).trim(); // 解析Insert语句 Insert insert = (Insert) CCJSqlParserUtil.parse(insertSql); }
这种方式适合只关心Insert部分的场景,但通用性较差,若Hibernate生成的SQL格式变化可能失效。
内容的提问来源于stack exchange,提问作者Gilles
相关产品推荐
相关产品推荐

