使用Oracle SODA API for Java查询时遇ORA-00907缺失右括号异常
问题分析
从你的异常堆栈能看到底层抛出了ORA-00907: missing right parenthesis,这说明SODA自动生成的SQL语句存在语法错误。问题根源在于你使用的**$orderby语法**——Oracle Database 12c Release 1(12.1.0.2)的SODA实现并不支持对象形式的$orderby定义,而你写的{"LmCreatedOn": -1}正好是这种不被12.1版本兼容的写法。
解决方案
在Oracle 12.1的SODA中,$orderby必须以数组形式定义,有两种合法的写法可以选择:
写法1:完整对象格式(明确指定字段路径和排序方向)
{ "$query" : {}, "$orderby" : [{ "path" : "LmCreatedOn", "direction" : "desc" }]}
写法2:简化字符串格式(直接写字段名+排序关键字)
{ "$query" : {}, "$orderby" : ["LmCreatedOn desc"]}
修改后的Java代码示例
以完整对象格式为例,替换你原来的查询语句即可:
// 连接代码在此上方 final OracleDocument document = db.createDocumentFromString("{ \"$query\" : {}, \"$orderby\" : [{ \"path\" : \"LmCreatedOn\", \"direction\" : \"desc\" }]}"); final OracleCursor cursor = db.openCollection(SC_LMS_ADMIN_COURSE).find().filter(document).getCursor(); List<JsonNode> listDto = new ArrayList<JsonNode>(); while(cursor.hasNext()) { final OracleDocument doc = cursor.next(); listDto.add(JacksonUtils.getObjectMapper().readTree(doc.getContentAsString())); }
为什么原来的写法会报错?
Oracle SODA在12.1版本中,无法正确解析对象形式的$orderby,会生成带有语法缺陷的SQL语句,最终触发ORA-00907错误。而数组形式的$orderby是12.1版本唯一支持的排序语法,对象形式的排序定义要到12.2及以后的版本才被支持。
额外排查小技巧
- 确认数据库版本:执行
SELECT * FROM v$version;查看版本号,如果是12.1.x.x,必须使用数组形式的$orderby。 - 开启SODA SQL日志:设置系统属性
oracle.soda.debug=true,可以查看自动生成的SQL语句,方便快速定位语法类问题。
内容的提问来源于stack exchange,提问作者Kaustubh Khare
相关产品推荐
相关产品推荐

