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

使用Pageable排序时触发InvalidPathException问题排查

问题解决:Pageable排序字段被莫名添加前缀导致InvalidPathException

问题根源

你的HQL查询里用了错误的cast语法来判断参数是否为空,比如cast(:dateFrom as org.hibernate.type.DateType) is null这种写法,会让Hibernate把类型标识符(像org.hibernate.type.DateType)错误解析成实体路径的一部分,处理Pageable排序时就会把这个前缀拼到排序字段前面,搞出org.referenzNumber这种无效路径。

后来你改成cast(:dateFrom as date)后出现date.referenzNumber,也是同一个逻辑——Hibernate把date当成了路径前缀。

解决方案

1. 删掉多余的cast语句

判断参数是否为空根本不需要cast,直接用参数本身判断就行。把你的HQL查询字符串改成这样:

static final String SEARCH_ORDER = "SELECT o" //
        + " FROM Order o " //
        + " WHERE (:partnerernumber is null or o.tradeBasis.account.retailpartner.partnerbank.partnerernumber = :partnerernumber)"
        + "   and (:accountnumber is null or o.tradeBasis.account.accountnumber = :accountnumber)"
        + "   and (:orderReference is null or o.tradeBasis.referenceNumber = :orderReference)"
        + "   and (:orderReferenceExtern is null or o.tradeBasis.kundenreferenceExternesFrontend = :orderReferenceExtern)"
        + "   and (:dateFrom is null or o.tradeBasis.timestamp > :dateFrom) "
        + "   and (:dateTo is null or o.tradeBasis.timestamp < :dateTo) ";

2. (可选)真要转类型就用标准HQL类型别名

如果确实需要转换参数类型(比如前端传的类型不匹配),用HQL内置的类型别名,别用Hibernate的具体类名,比如integer、bigdecimal、date这些,但注意别在is null判断里用:

cast(:dateFrom as date) // 只在需要转类型时用,别用来判断是否为空

3. 验证Pageable排序

改完HQL后,Repository的searchOrder方法就能正常解析Pageable里的排序字段,不会再乱加前缀了。

验证结果

修改后,控制器传递的Page request [number: 0, size 10, sort: referenzNumber: DESC]会被正确解析,Hibernate生成的排序SQL也正常,不会再抛出InvalidPathException。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:36:38