如何在 JPA 标准 API 中创建“ order by ”子句,通过避免日期的时间部分对日期字段进行排序。
相当于 :- 的东西 SELECT EMP_NAME,DOJ FROM EMPLOYEE ORDER BY trunc(DOJ)
。
如何在 JPA 标准 API 中创建“ order by ”子句,通过避免日期的时间部分对日期字段进行排序。
相当于 :- 的东西 SELECT EMP_NAME,DOJ FROM EMPLOYEE ORDER BY trunc(DOJ)
。
您可以使用CriteriaBuilder#function进行日期提取。但要小心,这种方法依赖于 RDBMS 的特定功能:这不是可移植的。
查看我们与 postgresql 一起使用的示例
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
Root<Employee> employee = cq.from(Employee.class);
String postgresTimeUnit = "day";
Expression<Calendar> dateTruncExpr = cb.function("date_trunc", Calendar.class, cb.literal(postgresTimeUnit), employee.get(Employee_.date)).as(Calendar.class);
cq.select(
employee
).where(
// where stuff
).orderBy(
cb.asc(dateTruncExpr)
);
此示例使用 postgresql 函数date_trunc及其特定的 dsl 来描述日期字段(此处的“天”表示我们要提取日期字段的日期)
生成的sql查询如下:
select employee0_.id as col_0_0_, employee0_.name as col_0_1_, employee0_.date as col_0_2_ from employee employee0_ order by date_trunc(?, employee0_.date) asc
JPA 2.0 规范没有定义任何日期提取函数。因此,您需要使用本机 SQL 或特定于您的 JPA 提供程序的语法。
如果您使用的是 EclipseLink 2.4,您可以使用 EXTRACT,
见, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Querying/JPQL#Functions
在以前的 EclipseLink 版本中,您可以使用 FUNC 在 JPQL 中调用特定于数据库的函数。
JPA 2.1 草案为此定义了一个 FUNCTION 运算符。