是否可以在jpa条件查询的where子句的子查询中与2个字段匹配?

时间:2019-08-22 08:54:05

标签: jpa criteriaquery

我想从按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

这可能吗?

0 个答案:

没有答案