Date JPA标准:通过截断日期使用ORDERBY子句

Date JPA标准:通过截断日期使用ORDERBY子句,date,jpa,sql-order-by,criteria-api,Date,Jpa,Sql Order By,Criteria Api,如何在JPA标准API中创建“order by”子句,通过避免日期的时间部分对日期字段进行排序 相当于:-从trunc(DOJ)的员工订单中选择EMP_名称,DOJJPA 2.0规范没有定义任何日期提取功能。因此,您需要使用本机SQL或特定于JPA提供程序的语法 如果您使用的是EclipseLink 2.4,您可以使用EXTRACT 看,, 在以前的EclipseLink版本中,可以使用FUNC在JPQL中调用特定于数据库的函数 JPA2.1草案定义了相同的函数运算符。您可以使用来进行日期提取

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


相当于:-
从trunc(DOJ)的员工订单中选择EMP_名称,DOJ

JPA 2.0规范没有定义任何日期提取功能。因此,您需要使用本机SQL或特定于JPA提供程序的语法

如果您使用的是EclipseLink 2.4,您可以使用EXTRACT

看,,

在以前的EclipseLink版本中,可以使用FUNC在JPQL中调用特定于数据库的函数

JPA2.1草案定义了相同的函数运算符。

您可以使用来进行日期提取。但是要小心,这种方法依赖于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)
);

由于您只按此列排序,按日期和时间排序将产生可接受的结果:行将按日期排序。@siebz0r:-如问题中所述,DOJ字段将包含日期+时间,当它输入数据库时。但在某些情况下,需要避免时间部分,只根据日期显示雇员的详细信息(比如在sceen上显示)。@JB Nizet:-假设我想在另一列上排序(比如按DOJ、姓名排序)。在这种情况下,它可能会导致问题。如何显示数据与如何获取数据无关。只需使用日期+时间获取数据,当显示日期时,去掉时间。简言之,使用@JBNizet的答案。假设我想根据DOJ(desc)和NAME(asc)对员工详细信息进行排序。有两个皇帝。(第一次环境管理计划)-司法部=2012年6月13日10:00:00,姓名=ABC,(第二次环境管理计划)-司法部=2012年6月13日11:00:00,姓名=PQR。在这里,如果我们考虑日期+时间,第二EMP将首先来自11小时> 10。但是如果我们避开日期字段中的时间部分,第一个emp将首先出现,然后是第二个emp(这就是我需要的)。希望这个例子能解释我面临的问题。
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