In my persistence layer which is implemented generically i have fully workable method for left joining i.e
Join<?, ?> join = root.join(router, JoinType.LEFT);
map.forEach(
(u, v) -> unionPredicates
.add(join.on(criteriaBuilder.equal(join.get(u), v)).getOn()));
Where unionPredicates is just predicate list with union condition but for counting with join requirement as
CriteriaQuery<Long> countCriteriaQuery = criteriaBuilder.createQuery(Long.class);
Root<R> countRoot = countCriteriaQuery.from(type);
entityManager.createQuery(countCriteriaQuery.select(criteriaBuilder
.count(countRoot))
.where(criteriaBuilder
.and(unionPredicates.toArray(new Predicate[]{})))).getSingleResult();
The return value is incorrect .