我想从按ID和Modifydate分组的记录子集中获取项目,而我只得到最新的项目。
例如,表可能是
Id dataId modifiedDateTime
1 John 2019-08-21 11:46:05.758
2 Mary 2019-08-21 11:46:05.758
3 David 2019-08-21 11:46:05.850
4 Ashim 2019-08-21 11:46:05.870
5 John 2019-08-21 11:46:05.999
此刻,我正在执行查询以通过对Modifieddate进行匹配来对最新的where子句进行选择,从而选择由dataId分组的记录。
这是一个错误,因为玛丽的最新日期与约翰的较早日期相匹配,所以我同时获得了约翰的两个记录。
因此sql就像
Select dataId
FROM table
WHERE modifiedDateTime IN
(Select MAX(modifiedDateTime) as m
FROM table
GROUP BY dataId )
代码在这些行中
Expression where = criteriaBuilder.in(from.get(mostRecentField)).value(getSubquery());
经过更多修改后将其分配给criteriaQuery
criteriaQuery.where(where);
当前,我建立一个像这样的子查询
Private Subquery getSubQuery(Class<?> entityClass)
{
Subquery<Long> subquery = criteriaQuery.subquery(Long.class);
Root dateSQ = subquery.from(entityClass);
subquery.select(criteriaBuilder.max(dateSQ.get(modifiedDateField)));
subquery.groupBy(dataIdString);
return subquery;
}
这将创建要加入的日期查询。问题在于,有时来自一个ID的日期可能包含来自另一个ID的不需要的记录。
我可以看到2种解决方案 1)返回并加入date和dataIdString 2)嵌套查询以返回基础ID
我正在努力做到其中之一!
我的问题确实是,有没有办法改变
Expression where = criteriaBuilder.in(from.get(mostRecentField)).value(getSubquery());
如果我从子查询中返回了dataId和日期,则要对这两个字段进行检查/联接?
沿这些行
表达式其中= criteriaBuilder.in(from.get(mostRecentField))。value(getSubquery()。val1).get(datiIdField).value(getSubquery()。val2));
这看起来像是一团糟,所以我显然以错误的方式来处理它?也许我应该在子查询过程中构建一个嵌套子查询,以返回必要的ID,然后更改为
表达式,其中= criteriaBuilder.in(from.get(id))。value(getSubquery());
所以本质上我正在尝试模拟
SELECT a.dataId FROM table a
INNER JOIN
(
SELECT dataId, MAX(modifiedDateTime) m
FROM table
GROUP BY dataId
) b
ON a.dataId = b.dataId
AND a.modifiedDateTime = b.m
这可能吗?