অন্যের উত্তর যেমন সঠিক, তবে খুব সহজ, সুতরাং পরিপূর্ণতার জন্য আমি SELECT COUNT
একটি পরিশীলিত জেপিএ মানদণ্ডের কোয়েরিতে (একাধিক যোগদান, ফেচ, শর্ত সহ) সম্পাদনের জন্য কোড স্নিপেটের নীচে উপস্থাপন করছি ।
এটি এই উত্তরটি সামান্য পরিবর্তিত হয়েছে ।
public <T> long count(final CriteriaBuilder cb, final CriteriaQuery<T> selectQuery,
Root<T> root) {
CriteriaQuery<Long> query = createCountQuery(cb, selectQuery, root);
return this.entityManager.createQuery(query).getSingleResult();
}
private <T> CriteriaQuery<Long> createCountQuery(final CriteriaBuilder cb,
final CriteriaQuery<T> criteria, final Root<T> root) {
final CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
final Root<T> countRoot = countQuery.from(criteria.getResultType());
doJoins(root.getJoins(), countRoot);
doJoinsOnFetches(root.getFetches(), countRoot);
countQuery.select(cb.count(countRoot));
countQuery.where(criteria.getRestriction());
countRoot.alias(root.getAlias());
return countQuery.distinct(criteria.isDistinct());
}
@SuppressWarnings("unchecked")
private void doJoinsOnFetches(Set<? extends Fetch<?, ?>> joins, Root<?> root) {
doJoins((Set<? extends Join<?, ?>>) joins, root);
}
private void doJoins(Set<? extends Join<?, ?>> joins, Root<?> root) {
for (Join<?, ?> join : joins) {
Join<?, ?> joined = root.join(join.getAttribute().getName(), join.getJoinType());
joined.alias(join.getAlias());
doJoins(join.getJoins(), joined);
}
}
private void doJoins(Set<? extends Join<?, ?>> joins, Join<?, ?> root) {
for (Join<?, ?> join : joins) {
Join<?, ?> joined = root.join(join.getAttribute().getName(), join.getJoinType());
joined.alias(join.getAlias());
doJoins(join.getJoins(), joined);
}
}
আশা করি এটি কারও সময় সাশ্রয় করবে।
কারণ আইএমএইচও জেপিএ ক্রিটারিয়া এপিআই স্বজ্ঞাত নয় এবং বেশ পাঠযোগ্য।