Spring-Data FETCH JOIN with Paging is not working

前端 未结 5 1740
野性不改
野性不改 2020-11-30 05:37

I am trying to use HQL fetching my entity along with sub-entities using JOIN FETCH, this is working fine if I want all the results but it is not the case if I want a Page

5条回答
  •  渐次进展
    2020-11-30 06:14

    If you want completely control your query build by Specification with join fetch you can check CriteriaQuery return type and change join fetch logic according to query type like this:

    public class ContactSpecification implements Specification {
        @Override
        public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {
            if(query.getResultType() == Long.class) {
                root.join(Contact_.company);
            } else {
                root.fetch(Contact_.company);
            }
            return cb.equal(root.get(Contact_.company).get(Company_.name), "Company 123");
        }
    }
    

    I was not able to find this info in documentation, but from SimpleJpaRepository.getCountQuery() method you can see query for count request first build for Long return type, and later fetch for expected class is running.

    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery query = builder.createQuery(Long.class);
    
    Root root = applySpecificationToCriteria(spec, domainClass, query);
    

    It can be not reliable since it is an implementation details which can be changed, but it works.

提交回复
热议问题