【问题标题】:JPA Criteria : Using order-by clause by truncating dateJPA 标准:通过截断日期使用 order-by 子句
【发布时间】:2012-06-13 19:35:25
【问题描述】:

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

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

【问题讨论】:

  • 由于您仅按此列排序,因此按日期和时间排序将产生可接受的结果:行将按日期排序。
  • @siebz0r :- 如问题中所述,当 DOJ 字段输入 DB 时,它将包含日期+时间。但在某些情况下,需要避开时间部分,仅根据日期显示员工的详细信息(例如在屏幕上显示)。
  • @JB Nizet :-假设我想再排序一列(比如按 DOJ 排序,姓名)。在这种情况下,它可能会导致问题。
  • 如何显示数据与获取数据的方式无关。只需使用日期+时间获取数据,当您显示日期时,去掉时间。简而言之,请选择@JBNizet 的答案。
  • 假设我想根据 DOJ(desc) 和 NAME (asc) 对员工详细信息进行排序。有两个emp。 (第一届)- DOJ=13-Jun-12 10:00:00,姓名=ABC,(第二届)- DOJ=13-Jun-12 11:00:00,姓名=PQR。在这里,如果我们考虑日期+时间,则从 11>10 小时开始,第二个 emp 将首先出现。但是如果我们避免日期字段中的时间部分,第一个 emp 将首先出现,然后是第二个 emp。(这就是我需要的)。希望这个例子能解释我面临的问题。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-05
      • 2021-12-23
      • 1970-01-01
      • 2012-08-08
      • 2018-06-03
      • 1970-01-01
      • 2023-02-21
      相关资源
      最近更新 更多