查询分类及对应产品数时Join关联后Function.count返回0
错误原因分析
1. 字段引用方式错误
你的查询中,构建字段表达式时错误地将表别名拼入了字段名字符串,比如Expression.property("$productAlias.catId")和Expression.property("$catAlias.catId")。这类查询构建器的Expression.property()方法仅需传入字段名,数据源/表别名是通过.from(alias)指定的,不需要将别名作为字段名的一部分。
这种写法会让查询引擎把$productAlias.catId当作完整字段名去匹配,而非productAlias别名下的catId字段,最终导致关联条件完全不匹配,产品和分类无法关联,总数自然始终为0。
2. 关联与聚合的逻辑细节问题
左连接场景下,即便字段引用正确,也建议用Function.count(Expression.property("catId").from(productAlias))或Function.count(Expression.all().from(productAlias))统计产品数量——前者统计非空的catId行数,后者直接统计关联到的产品总行数,结果一致,但能避免因字段空值导致的统计偏差。
修正后的关键代码片段
// 修正count统计表达式 SelectResult.expression(Function.count(Expression.property("catId").from(productAlias))).`as`("totalProducts"), // 修正关联条件中的字段引用 Join.leftJoin(DataSource.database(readsDB).`as`(productAlias)) .on( Expression.property("type").from(productAlias).equalTo(Expression.string("product")) .and( Expression.property("catId").from(productAlias) .equalTo(Expression.property("catId").from(catAlias)) ) ) // 修正group by的字段引用 .groupBy(Expression.property("catId").from(catAlias))
内容的提问来源于stack exchange,提问作者Nie Selam
相关产品推荐
相关产品推荐

