JPA标准:通过截断日期来使用order-by子句

问题描述 投票:4回答:2

如何在JPA条件API中创建“order by”子句,通过避免日期的时间部分对日期字段进行排序。

相当于的东西: - SELECT EMP_NAME,DOJ FROM EMPLOYEE ORDER BY trunc(DOJ)

date jpa sql-order-by criteria-api
2个回答
0
投票

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运算符。


0
投票

您可以使用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来描述日期字段(此处的“day”表示我们要提取日期字段的日期)

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
© www.soinside.com 2019 - 2024. All rights reserved.