JPA子查詢


單表查詢、不太復雜的關聯查詢適合用JPA,除此以為,一些復雜的SQL,比如自定義動態分頁查詢真的不建議用JPA,實現起來比較麻煩,還不如MyBatis來得直接

以下面的子查詢為例:

SELECT 
	t1.* 
FROM approval_task t1 
WHERE t1.approver_username = 'yangxiao'
	AND NOT EXISTS (
		SELECT
			t2.id 
		FROM
			approval_task t2 
		WHERE
			t2.apply_id = t1.apply_id 
			AND t2.approver_username = t1.approver_username 
			AND t2.create_time > t1.create_time
	) 
ORDER BY
	t1.task_type ASC,
	t1.create_time DESC 
	LIMIT 20;

 對應的jpa代碼如下:

public Page<ApprovalTask> pageList(ApprovalTaskQueryCriteria criteria, Pageable pageable) {
    return approvalTaskRepository.findAll(new Specification<ApprovalTask>() {
        @Override
        public Predicate toPredicate(Root<ApprovalTask> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
            Subquery<ApprovalTask> subquery = query.subquery(ApprovalTask.class);
            Root<ApprovalTask> subRoot = subquery.from(ApprovalTask.class);
            List<Predicate> subList = new ArrayList<>();
            subList.add(criteriaBuilder.equal(subRoot.get("applyId"), root.get("applyId")));
            subList.add(criteriaBuilder.equal(subRoot.get("approverUsername"), root.get("approverUsername")));
            subList.add(criteriaBuilder.gt(subRoot.get("createTime"), root.get("createTime")));
            subquery.where(subList.toArray(new Predicate[subList.size()]));
            subquery.select(subRoot.get("id"));

            List<Predicate> list = new ArrayList<>();
            list.add(criteriaBuilder.not(criteriaBuilder.exists(subquery)));
            if (StringUtils.isNoneBlank(criteria.getApproverUsername())) {
                list.add(criteriaBuilder.equal(root.get("approverUsername"), criteria.getApproverUsername()));
            }
            if (StringUtils.isNotBlank(criteria.getApplicantName())) {
                list.add(criteriaBuilder.like(root.get("applicantName"), criteria.getApplicantName()));
            }
            if (StringUtils.isNotBlank(criteria.getIdCard())) {
                list.add(criteriaBuilder.like(root.get("idCard"), criteria.getIdCard()));
            }
            if (null != criteria.getStatus()) {
                list.add(criteriaBuilder.equal(root.get("status"), criteria.getStatus()));
            }
            if (null != criteria.getApplyStartTime() && null != criteria.getApplyEndTime()) {
                list.add(criteriaBuilder.between(root.get("applyTime"), criteria.getApplyStartTime(), criteria.getApplyEndTime()));
            }
            return criteriaBuilder.and(list.toArray(new Predicate[list.size()]));
        }
    }, pageable);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM