Hibernate OGM MongoDB:比较操作符查询小于1的值报错
问题分析与解决方案
看起来你遇到的问题本质上和$lt等操作符处理小于1的数值无关,而是传递给Hibernate OGM NativeQuery的查询格式错误——你用了MongoDB Shell的命令语法,但OGM需要的是纯JSON格式的查询/命令。
错误原因
Hibernate OGM针对MongoDB的NativeQuery接口,接受的是符合MongoDB驱动要求的纯JSON查询文档或命令,而不是交互式Shell里的db.collection.count(...)或db.collection.aggregate(...)这种语法。当你传递带db开头的字符串时,JSON解析器会尝试将其解析为JSON结构,但db.sales_stone_details.count(...)完全不符合JSON规范,因此抛出JsonParseException。
你之前测试数值1.3时看似正常,大概率是巧合(比如查询结果为空但没触发解析报错,或者测试时的代码和你贴的不一致),实际上不管数值大于还是小于1,这种Shell格式的命令都是错误的。
修正方案
1. 正确的Count查询写法
使用MongoDB的count命令的纯JSON格式,替换掉Shell风格的语句:
public long executeCountQuery(){ // 用MongoDB的count命令JSON格式,指定集合名和查询条件 String query = "{\"count\": \"sales_stone_details\", \"query\": {\"size\": {\"$lt\": 0.3}}}"; long count = (long) entityManager.createNativeQuery(query).getSingleResult(); return count; }
2. 正确的Aggregate查询写法
去掉db.collection.aggregate(...)的外壳,只传递聚合管道的纯JSON数组。另外注意:聚合结果无法直接映射到Stone实体(因为聚合输出只有_id和countForAggregate,没有Stone的其他字段),建议用Object[]接收或者创建一个专用DTO:
public long executeCountQuery(){ // 仅传递聚合管道的JSON数组 String query = "[{\"$match\": {\"size\": {\"$lt\": 0.3}}},{\"$group\": {\"_id\": \"59df0d28f16b004af040c38c\", \"countForAggregate\": {\"$sum\": 1}}}]"; List<Object[]> aggregateResults = entityManager.createNativeQuery(query).getResultList(); long count = 0; if (!aggregateResults.isEmpty()){ // countForAggregate是聚合结果的第二个元素(索引1) count = (long) aggregateResults.get(0)[1]; } return count; }
额外说明
- 所有MongoDB的查询操作符(
$lt/$gt/$gte/$lte等)对小于1的数值完全支持,不存在处理限制,你的问题和操作符本身无关。 - 如果需要更类型安全的查询,也可以考虑使用Hibernate OGM的Criteria API,避免手写JSON字符串的麻烦。
内容的提问来源于stack exchange,提问作者vishvas4u
相关产品推荐
相关产品推荐

