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

