我有一个这样的Measurements表:
Measurements
___________________________________________________________________________________________________
| id | created_at | person_id | temperature |..... several columns with other values .... |
我想使用Spring Data Specification来查询带有搜索条件动态列表的表。挑战在于,我只想获取每个符合搜索条件的person_id的最新条目。获取每个人的最新结果的查询可以是这样的:
select *
from Measurements m
inner join (
select person_id, max(created_at) as MaxDate
from Measurements
group by person_id
) tm on p.person_id = tm.person_id and p.created_at = tm.MaxDate
如何将与Specification相似的子查询与搜索条件谓词合并。
public static Specification<Measurements> findByCriteria(final SearchCriteria searchCriteria) {
return new Specification<Measurements >() {
private static final long serialVersionUID = 1L;
@Override
public Predicate toPredicate(Root<Patient> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
if(searchCriteria.getTempMinLimit() != null) {
predicates.add(cb.greaterThanOrEqualTo(root.get("temperature"), searchCriteria.getTempMinLimit()));
}
/*
other predicates
*/
好的,所以我发现子查询只能放在查询的WHERE部分。最后,我不得不将其分为两个查询。
对于toPredicate方法参数(公共谓词toPredicate(根,CriteriaQuery查询,CriteriaBuilder cb){),我仍然感到困惑。
当我尝试在查询参数上调用select时,没有任何反应。我可以直接使用查询参数还是必须使用CriteriaBuilder创建一个新的查询实例?