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

Hibernate Criteria API使用sqlRestriction报ORA-00904错误求助

解决Hibernate Criteria API sqlRestriction调用Oracle trunc函数时的ORA-00904错误

问题根源

你遇到的ORA-00904错误,是因为sqlRestriction中直接使用实体字段名pubmedImportDate,但Hibernate生成SQL时会给表自动分配别名(比如this_),导致数据库无法识别未带别名前缀的字段。

解决方案

在sqlRestriction的SQL片段中,使用Hibernate提供的{alias}占位符来引用当前Criteria对应的表别名,Hibernate会自动将其替换为实际生成的别名(如this_)。

修改后的代码如下:

Session session = sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(Publication.class);

// 其他非SQL限制条件...

criteria.add(Restrictions.sqlRestriction("trunc({alias}.pubmedImportDate) >= ?", 
                                         todayMinus24Months, 
                                         org.hibernate.type.StandardBasicTypes.DATE));

效果验证

修改后Hibernate生成的SQL会变成:

from
    PUBLICATIONS_T this_ 
...
trunc(this_.pubmedImportDate) >= ?

此时字段关联了正确的表别名,数据库能识别this_.pubmedImportDate,错误即可解决。

补充说明

如果你之前手动指定别名p未生效,是因为sqlRestriction中的{alias}是Hibernate为当前Criteria自动管理的表别名,不需要手动指定,直接使用该占位符就能自动关联到正确的别名。

内容的提问来源于stack exchange,提问作者gene b.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:10:32