JPA 标准 - 如何使用 EXTRACT(字段 FROM 时间戳)?

Posted

技术标签:

【中文标题】JPA 标准 - 如何使用 EXTRACT(字段 FROM 时间戳)?【英文标题】:JPA Criteria - how to use EXTRACT(field FROM timestamp)? 【发布时间】:2019-08-02 13:07:24 【问题描述】:

有一个

<T> Expression<T>   function(java.lang.String name, java.lang.Class<T> type, Expression<?>... args)

CriteriaBuilder中的方法,允许

为执行数据库函数创建一个表达式。

很好。例如,我可以从时间戳中提取小时:

Expression<Integer> year = cb.function("YEAR", Integer.class, root.get("tstamp"));

但是如何包装相当于

的 SQL
SELECT EXTRACT(ISO_DAY_OF_WEEK FROM tstamp) FROM myTable

?有可能吗?我需要按星期几分组,所以我需要在数据库级别执行此操作。

【问题讨论】:

【参考方案1】:

试试这个:

cb.function("TO_CHAR",root.get("tstamp"),cb.literal("DD")));

【讨论】:

【参考方案2】:

PostgreSQL 函数 extract(? from ?) 是原生函数“date_part”的封装,它接受两个参数文本和日期/时间/时间戳/间隔。这意味着您可以调用:

Expression<Integer> year = cb.function("date_part", Integer.class, cb.literal('HOUR'), root.get("tstamp"));

【讨论】:

以上是关于JPA 标准 - 如何使用 EXTRACT(字段 FROM 时间戳)?的主要内容,如果未能解决你的问题,请参考以下文章

从日期开始的日期 EXTRACT(DAY,s.date) 不起作用 jpa 和 eclipseLink

使用 JPA 获取集合时避免 N+1 和笛卡尔积问题的标准方法是啥

如何使用更新的 JPA 时间戳字段升级数据库?

如何使用 UUID 字段而不是 JPA 的主键?

如何使用 JPA 初始化表示其插入数据库的日期时间的实体字段?

使用 str.extract 时,熊猫不会覆盖列字段