Spring数据规范+子查询

时间:2020-05-12 15:15:42

标签: spring-data-jpa subquery specifications

我有一个这样的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创建一个新的查询实例?

0 个答案:

没有答案