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

如何使用CriteriaBuilder映射PostgreSQL的extract时间提取表达式?

PostgreSQL Extract函数的CriteriaBuilder映射方案

核心思路

PostgreSQL的extract(part from column)是数据库原生函数,在JPA Criteria API中可以通过CriteriaBuilder.function()直接调用,关键是把提取部分(如hour、minute、dow)作为字面量参数传入,同时绑定实体的ZonedDateTime字段。

代码示例

假设你的实体类是Meeting,对应数据库meetings表,字段start对应start_time:

1. 提取小时(对应SQL: extract(hour from start_time))

// 获取CriteriaBuilder实例
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Integer> query = cb.createQuery(Integer.class);
Root<Meeting> meetingRoot = query.from(Meeting.class);

// 构建extract函数表达式
Expression<Integer> hourExpr = cb.function(
    "extract",
    Integer.class,
    cb.literal("hour"), // 提取部分:hour
    meetingRoot.get("start") // 实体的ZonedDateTime字段
);

// 组装查询:筛选id=5,提取小时
query.select(hourExpr).where(cb.equal(meetingRoot.get("id"), 5));

// 执行查询
Integer hour = entityManager.createQuery(query).getSingleResult();

2. 提取分钟(对应SQL: extract(minute from start_time))

仅需将字面量参数替换为"minute":

Expression<Integer> minuteExpr = cb.function(
    "extract",
    Integer.class,
    cb.literal("minute"),
    meetingRoot.get("start")
);

3. 提取星期几(对应SQL: extract(dow from start_time))

PostgreSQL中dow代表星期几(周日=0,周一=1,……,周六=6),写法如下:

Expression<Integer> dayOfWeekExpr = cb.function(
    "extract",
    Integer.class,
    cb.literal("dow"),
    meetingRoot.get("start")
);

注意事项

  • 主流JPA提供者(如Hibernate)均支持直接调用PostgreSQL的extract函数,无需额外配置。
  • 若需处理时区逻辑,可在实体字段上通过@Column的columnDefinition指定时区规则,extract会基于数据库存储的时间值直接计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 19:38:23