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.
相关产品推荐
相关产品推荐

