【问题标题】:INTERVAL near line 1 : Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException第 1 行附近的 INTERVAL:由 org.hibernate.hql.internal.ast.QuerySyntaxException 引起
【发布时间】:2020-05-26 14:01:05
【问题描述】:

引起:org.hibernate.hql.internal.ast.QuerySyntaxException: 意外令牌:INTERVAL 附近

这是我的查询:

 private static final String USERS_NOT_ACTION_IN_LAST_MONTH = select u from myTable u where u.lastDate + INTERVAL 30 DAY <= CURDATE();

 @Override
 public List<MyEntity> getItemOlderThanMonth() {
    Query q = _entityManager.createQuery(USERS_NOT_ACTION_IN_LAST_MONTH, MyEntity.class);
    return q.getResultList();
 }

我想获取超过 30 天的记录。

【问题讨论】:

  • ANSI SQL方式:INTERVAL '30' DAY
  • 在性能方面select u from myTable u where u.lastDate &lt;= CURDATE() - INTERVAL '30' DAY;更安全。
  • 但得到同样的错误:“unexpected token: INTERVAL”
  • hql 没有 INTERVAL 语法。 MySQL 有。

标签: mysql sql hibernate date jpa


【解决方案1】:

您可以通过查询参数(current_date- 30)计算当前日期

private static final String USERS_NOT_ACTION_IN_LAST_MONTH = select u from myTable u where u.lastDate

其中计算日期=当前日期 -30 天。

【讨论】:

    【解决方案2】:

    通过使用 _entityManager.createQuery 创建hibernate sql (hql) 脚本并且hibernate 没有INTERVAL 关键字。

    但 createNativeQuery 是原生 sql,其行为与普通 sql 脚本相同。所以对于 mysql db INTERVAL 关键字应该可以工作。就这样吧

    _entityManager.createNativeQuery("select * from myTable u where u.lastDate + INTERVAL 30 DAY <= CURDATE()");
    

    【讨论】:

      猜你喜欢
      • 2015-07-12
      • 2016-02-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2023-02-13
      相关资源
      最近更新 更多