hibernate 5 HQL 中的日期函数
Date Functions in hibernate 5 HQL
所以我对休眠有点陌生,因此请耐心等待。我有一个像这样的 mysql 查询:
SELECT SUM(PLAN_ID), USER_ID
FROM TABLE_A
WHERE ACTIVATION_DATE
BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)
AND LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH))
AND USER_ID in ('123','124') GROUP BY '123';
我正在尝试 运行 使用 hibernate 5 JPQL 查询进行同样的操作。这是我试过的:
Map<Integer, List<Object>> result = null;
Query query = null;
Session session = null;
session = SessionFactoryUtil.getSessionFactory().openSession();
result = new HashMap<Integer, List<Object>>();
query = session.createQuery(aggregationQuery);
int rowNo = 0;
for (Iterator it = query.iterate(); it.hasNext();) {
rowNo ++;
result.put(rowNo, (List<Object>) it.next());
}
然而它抛出 Unexpected token errors
。有人会介意解释我在这里做错了什么吗?
非常感谢。
您不能按原样使用它们,因为 JPQL 不认识它们。
您有两个选择:
1) 使用SQL
session.createNativeQuery(aggregationQuery);
2) 使用JPQL函数
function('DATE_ADD', function('LAST_DAY', function('DATE_SUB', current_date, function('INTERVAL', 2, 'MONTH')), function('INTERVAL' 1, DAY)
选项 2 不是工作代码,它只是一个示例,向您展示这可能导致的结果。您可能对本机查询使用更好的选项 1。
所以我对休眠有点陌生,因此请耐心等待。我有一个像这样的 mysql 查询:
SELECT SUM(PLAN_ID), USER_ID
FROM TABLE_A
WHERE ACTIVATION_DATE
BETWEEN DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)
AND LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH))
AND USER_ID in ('123','124') GROUP BY '123';
我正在尝试 运行 使用 hibernate 5 JPQL 查询进行同样的操作。这是我试过的:
Map<Integer, List<Object>> result = null;
Query query = null;
Session session = null;
session = SessionFactoryUtil.getSessionFactory().openSession();
result = new HashMap<Integer, List<Object>>();
query = session.createQuery(aggregationQuery);
int rowNo = 0;
for (Iterator it = query.iterate(); it.hasNext();) {
rowNo ++;
result.put(rowNo, (List<Object>) it.next());
}
然而它抛出 Unexpected token errors
。有人会介意解释我在这里做错了什么吗?
非常感谢。
您不能按原样使用它们,因为 JPQL 不认识它们。
您有两个选择:
1) 使用SQL
session.createNativeQuery(aggregationQuery);
2) 使用JPQL函数
function('DATE_ADD', function('LAST_DAY', function('DATE_SUB', current_date, function('INTERVAL', 2, 'MONTH')), function('INTERVAL' 1, DAY)
选项 2 不是工作代码,它只是一个示例,向您展示这可能导致的结果。您可能对本机查询使用更好的选项 1。