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

从WildFly 21迁移至29后,JPA Criteria API中Oracle不识别day/month函数

解决Oracle下JPA Criteria API提取日期月/日的问题

问题根源

Oracle数据库没有month和day这两个内置函数,你之前的写法适配的是其他数据库(比如MySQL),因此在Oracle环境下无法识别。

修改方案

改用Oracle原生的EXTRACT函数来提取日期中的月份和日期部分,直接通过CriteriaBuilder.function调用即可:

CriteriaBuilder cb = this.manager.getCriteriaBuilder();
CriteriaQuery<Servidor> cq = cb.createQuery(Servidor.class);
Root<Servidor> root = cq.from(Servidor.class);

jakarta.persistence.criteria.Path<Date> dataAnivPath = root.<Date>get("dataNascimento");
// 提取月份
Expression<Integer> mesAnivPath = cb.function("EXTRACT", Integer.class, 
    cb.literal("MONTH"), dataAnivPath);
// 提取日期
Expression<Integer> diaAnivPath = cb.function("EXTRACT", Integer.class, 
    cb.literal("DAY"), dataAnivPath);

额外注意事项

  • 确认Hibernate方言配置正确:WildFly 29默认搭配的Hibernate版本较高,建议使用适配Oracle 12c及以上的方言(比如org.hibernate.dialect.Oracle12cDialect),避免因方言不兼容导致函数解析异常。
  • 如果你的字段类型是TIMESTAMP而非DATE,上述写法依然适用,EXTRACT函数支持Oracle的各类日期/时间类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:17:05