如何在 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));
我正在使用 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));