4

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

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

4

2 回答 2

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

生成的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
于 2013-03-06T09:49:54.260 回答
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 运算符。

于 2012-06-14T14:21:46.827 回答