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

时间:2012-06-10 17:50:36

标签: date jpa sql-order-by criteria-api

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

等同于: - SELECT EMP_NAME,DOJ FROM EMPLOYEE ORDER BY trunc(DOJ)

2 个答案:

答案 0 :(得分: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运算符。

答案 1 :(得分:0)

您可以使用CriteriaBuilder#function进行日期提取。但要小心,这种方法依赖于RDBMS特定的功能:这是 NOT 可移植。

查看我们与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