如何在 HQL 查询中从当前日期减去天数

How to Subtract number of days from current date in HQL query

我正在使用 HQL 获取从现在起正好 21 天后插入的数据。这是我的代码

Query queryThreeWeek = session.createQuery("from Users where createdDate = CURDATE()-21");
List<Users> userDetailsThreeWeekList = queryThreeWeek.list();

我无法使用createSQLQuery。 现在我没有得到任何数据,但有日期 2016-06-20 的数据。那是因为月份改变了,因为当我使用 CURDATE()-7 时,我得到了日期 2016-07-04 的正确数据。 dat 的计算就像;

2016-07-11 - 7 = 20160704
2016-07-11 - 21 = 20160690

我也厌倦了使用 INTERVAL,它适用于 native sqlQuery。这是我在 HQL 中使用 INTERVAL 的代码:

Query queryThreeWeek = session.createQuery("from Users where createdDate = DATE( DATE_SUB( NOW() , INTERVAL 21 DAY ) )");
List<Users> userDetailsThreeWeekList = queryThreeWeek.list();

也试过

Query queryThreeWeek = session.createQuery("from Users where createdDate = DATE( DATE_SUB( CURDATE() , INTERVAL 21 DAY ) )"); 
List<Users> userDetailsThreeWeekList = queryThreeWeek.list();

但它给了我这样的例外:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: 21

那么我可以用什么来代替像这样减去一天:CURDATE()-21?仅在 HQL 中

您可以在 本机 SQL 查询(不是 HQL 查询!)中使用 date_Sub:

 "from Users where createdDate =   DATE( DATE_SUB( NOW() , INTERVAL 21 DAY ) )" 

我已经通过使用一个本机 SQL 查询解决了这个问题,该查询可以获得准确的日期。

Query sub3Week = session.createSQLQuery("select DATE( DATE_SUB( CURDATE() , INTERVAL 21 DAY ) ) from dual");
List<Date> sub3WeekList = sub3Week.list();

然后我在 HQL 查询中使用这些数据,如下所示:

Query queryThreeWeek = session.createQuery("from Users where createdDate = :createdDate");
queryThreeWeek.setParameter("createdDate", sub3WeekList.get(0).toString());
List<Users> userDetailsThreeWeekList = queryThreeWeek.list();

使用 HQL 的解决方案非常简单:

        final long time = System.currentTimeMillis() - java.time.Duration.ofDays(21).toMillis();
        final javax.persistence.Query query = entityManagerOrSession.createQuery(
                "SELECT x FROM users x WHERE x.createddate> :time");
        query.setParameter("time", new java.sql.Timestamp(time));