You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Thymeleaf中使用条件表达式结合aggregates.sum求和的问题

解决Thymeleaf中聚合当前用户预订时长的问题

嘿,我来帮你搞定这个问题!你遇到的核心问题是在Thymeleaf的选择表达式(?[])里错误嵌套了${}语法,再加上对象比较时可能涉及equals方法的实现问题,咱们一步步拆解解决:

错误原因分析

Thymeleaf的OGNL表达式中,?[]内部已经处于EL上下文环境中,完全不需要再用${}或者__${}__包裹变量——这就是你抛出语法错误的直接原因。另外,直接写user == userObject时,如果你的User类没有正确重写equals和hashCode方法,对象引用比较大概率不会得到预期结果。

正确写法

1. 通过用户ID比较(最稳妥,不依赖equals实现)

直接在选择表达式里用变量名访问属性,去掉多余的${}包裹:

th:text="${#aggregates.sum(task.times.?[user.id == userObject.id].![timeSpent])} + ' hours'"

或者用getter方法调用(效果完全一致):

th:text="${#aggregates.sum(task.times.?[user.getId() == userObject.getId()].![timeSpent])} + ' hours'"

2. 通过对象比较(需正确实现User的equals方法)

如果你的User类已经基于ID(或唯一标识)重写了equals和hashCode,可以直接这样写:

th:text="${#aggregates.sum(task.times.?[user == userObject].![timeSpent])} + ' hours'"

注意:如果没重写equals,这里会比较对象内存引用,基本不符合业务预期,所以更推荐用ID比较的方式。

为什么之前的写法不行?

你硬编码用户名能成功,是因为'sandra'是字符串常量,不需要EL语法包裹;而引用userObject时,错误添加的${}会让Thymeleaf解析器误以为是表达式嵌套,直接触发语法错误。现在去掉多余的${},表达式就能正常解析运行了。

内容的提问来源于stack exchange,提问作者Greta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:38:11