【问题标题】:Problems with JPA Hibernate Query with 'Interval'带有“间隔”的 JPA Hibernate 查询问题
【发布时间】:2021-02-19 06:33:21
【问题描述】:

我需要能够为我的后端应用程序检索过去 6 个月的订单。

 @Query("Select ord From orders ord WHERE ord.created_date  <= (current_date  - INTERVAL '6 months')")
    List<Order> findOrders();
unexpected token: INTERVAL near line 1, column 70 [Select ord From orders ord WHERE ord.created_date  <= (current_date  INTERVAL '6 months')

经过一番研究,我发现 JPA 不支持 INTERVAL 定义。 有存档这个特殊功能的解决方法吗?

【问题讨论】:

  • 试试(current_date - cast('6 months' AS INTERVAL))。它应该可以工作,但我没有足够的信心将其发布为答案。
  • 试过你的版本。不幸的是,它不起作用
  • 在 JPA 或数据库中解析时它会崩溃吗?错误消息会很有用。
  • JPQL 和 HQL 不支持区间,您必须使用 Adam Gaj 提供的解决方案

标签: sql spring-boot hibernate jpa


【解决方案1】:

在这种情况下,使用 JPA 提供的功能,不需要本地 sql 代码。

  List<Order> findALLByCreatedDateBefore(Date fromDate);

在 java 端调用它

public void findOrders() {
    date = setMonthToJavaUtilDate(new Date(), -6);
    yourRepository.findOrders(fromDate)
    //your logic...
}

private Date setMonthToJavaUtilDate(Date date, int month) {
    Calendar now = Calendar.getInstance();
    now.setTime(date);
    now.add(Calendar.MONTH, month);
    return now.getTime();
}

【讨论】:

  • 我喜欢你的方法,但我想你也需要添加到你的日历中而不是设置月份,因为它现在可能会出现异常。设置月份 -> 需要 (0-11) --- > now.add(Calendar.MONTH, month);
【解决方案2】:

您可以通过在 java 代码中计算的日期参数化您的存储库方法。假设 created_dateInstant 类型,它会是这样的:

@Query("FROM orders ord WHERE ord.created_date  >= :fromDate")
List<Order> findOrders(Instant fromDate);

并调用它

Instant fromDate = Instant.now().minus(Duration.ofDays(182));
yourRepository.findOrders(fromDate)

【讨论】:

  • 是的,我想这应该是要走的路,而不是创建原生查询
  • 也喜欢这种方法,这也应该像一个魅力。
猜你喜欢
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 2023-02-20
  • 1970-01-01
  • 2020-12-25
  • 1970-01-01
相关资源
最近更新 更多