有一个
<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
?有可能吗?我需要按一周中的某一天进行分组,因此我需要在数据库级别执行此操作。
PostgreSQL 函数 extract(? from ?) 是本机函数“date_part”的包装器,它采用两个参数文本和日期/时间/时间戳/间隔。这意味着您可以致电:
Expression<Integer> year = cb.function("date_part", Integer.class, cb.literal('HOUR'), root.get("tstamp"));
试试这个:
cb.function("TO_CHAR",root.get("tstamp"),cb.literal("DD")));
我发现这个问题试图找到如何将 sql 时间戳映射到自 1970-01-01 00:00:00:00.00 以来的秒数。如果有人需要的话,这是解决方案:
cb.function("date_part", String.class, cb.literal("EPOCH"), root.get("timestamp"))