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

时间:2016-07-11 14:05:55

标签: java mysql hql

我正在使用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的{​​{1}}累了。以下是我在HQL中使用native sqlQuery的代码:

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?仅在HQL中

3 个答案:

答案 0 :(得分:1)

您可以使用date_Sub

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

答案 1 :(得分:1)

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

halted

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

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

答案 2 :(得分:1)

具有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));