net.shopxx.dao.impl.ArticleDaoImpl.java Source code

Java tutorial

Introduction

Here is the source code for net.shopxx.dao.impl.ArticleDaoImpl.java

Source

/*
 * Copyright 2005-2015 shopxx.net. All rights reserved.
 * Support: http://3936242.01p.com/
 * License: http://3936242.01p.com/license
 */
package net.shopxx.dao.impl;

import java.util.Date;
import java.util.List;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Subquery;

import net.shopxx.Filter;
import net.shopxx.Order;
import net.shopxx.Page;
import net.shopxx.Pageable;
import net.shopxx.dao.ArticleDao;
import net.shopxx.entity.Article;
import net.shopxx.entity.ArticleCategory;
import net.shopxx.entity.Tag;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Repository;

@Repository("articleDaoImpl")
public class ArticleDaoImpl extends BaseDaoImpl<Article, Long> implements ArticleDao {

    public List<Article> findList(ArticleCategory articleCategory, Tag tag, Boolean isPublication, Integer count,
            List<Filter> filters, List<Order> orders) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Article> criteriaQuery = criteriaBuilder.createQuery(Article.class);
        Root<Article> root = criteriaQuery.from(Article.class);
        criteriaQuery.select(root);
        Predicate restrictions = criteriaBuilder.conjunction();
        if (articleCategory != null) {
            Subquery<ArticleCategory> subquery = criteriaQuery.subquery(ArticleCategory.class);
            Root<ArticleCategory> subqueryRoot = subquery.from(ArticleCategory.class);
            subquery.select(subqueryRoot);
            subquery.where(criteriaBuilder.or(criteriaBuilder.equal(subqueryRoot, articleCategory),
                    criteriaBuilder.like(subqueryRoot.<String>get("treePath"),
                            "%" + ArticleCategory.TREE_PATH_SEPARATOR + articleCategory.getId()
                                    + ArticleCategory.TREE_PATH_SEPARATOR + "%")));
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.in(root.get("articleCategory")).value(subquery));
        }
        if (tag != null) {
            restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.join("tags"), tag));
        }
        if (isPublication != null) {
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.equal(root.get("isPublication"), isPublication));
        }
        criteriaQuery.where(restrictions);
        if (orders == null || orders.isEmpty()) {
            criteriaQuery.orderBy(criteriaBuilder.desc(root.get("isTop")),
                    criteriaBuilder.desc(root.get("createDate")));
        }
        return super.findList(criteriaQuery, null, count, filters, orders);
    }

    public List<Article> findList(ArticleCategory articleCategory, Boolean isPublication,
            Article.GenerateMethod generateMethod, Date beginDate, Date endDate, Integer first, Integer count) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Article> criteriaQuery = criteriaBuilder.createQuery(Article.class);
        Root<Article> root = criteriaQuery.from(Article.class);
        criteriaQuery.select(root);
        Predicate restrictions = criteriaBuilder.conjunction();
        if (articleCategory != null) {
            Subquery<ArticleCategory> subquery = criteriaQuery.subquery(ArticleCategory.class);
            Root<ArticleCategory> subqueryRoot = subquery.from(ArticleCategory.class);
            subquery.select(subqueryRoot);
            subquery.where(criteriaBuilder.or(criteriaBuilder.equal(subqueryRoot, articleCategory),
                    criteriaBuilder.like(subqueryRoot.<String>get("treePath"),
                            "%" + ArticleCategory.TREE_PATH_SEPARATOR + articleCategory.getId()
                                    + ArticleCategory.TREE_PATH_SEPARATOR + "%")));
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.in(root.get("articleCategory")).value(subquery));
        }
        if (isPublication != null) {
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.equal(root.get("isPublication"), isPublication));
        }
        if (generateMethod != null) {
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.equal(root.get("generateMethod"), generateMethod));
        }
        if (beginDate != null) {
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.greaterThanOrEqualTo(root.<Date>get("createDate"), beginDate));
        }
        if (endDate != null) {
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.lessThanOrEqualTo(root.<Date>get("createDate"), endDate));
        }
        criteriaQuery.where(restrictions);
        return super.findList(criteriaQuery, first, count, null, null);
    }

    public Page<Article> findPage(ArticleCategory articleCategory, Tag tag, Boolean isPublication,
            Pageable pageable) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Article> criteriaQuery = criteriaBuilder.createQuery(Article.class);
        Root<Article> root = criteriaQuery.from(Article.class);
        criteriaQuery.select(root);
        Predicate restrictions = criteriaBuilder.conjunction();
        if (articleCategory != null) {
            Subquery<ArticleCategory> subquery = criteriaQuery.subquery(ArticleCategory.class);
            Root<ArticleCategory> subqueryRoot = subquery.from(ArticleCategory.class);
            subquery.select(subqueryRoot);
            subquery.where(criteriaBuilder.or(criteriaBuilder.equal(subqueryRoot, articleCategory),
                    criteriaBuilder.like(subqueryRoot.<String>get("treePath"),
                            "%" + ArticleCategory.TREE_PATH_SEPARATOR + articleCategory.getId()
                                    + ArticleCategory.TREE_PATH_SEPARATOR + "%")));
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.in(root.get("articleCategory")).value(subquery));
        }
        if (tag != null) {
            restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.join("tags"), tag));
        }
        if (isPublication != null) {
            restrictions = criteriaBuilder.and(restrictions,
                    criteriaBuilder.equal(root.get("isPublication"), isPublication));
        }
        criteriaQuery.where(restrictions);
        if (pageable == null
                || ((StringUtils.isEmpty(pageable.getOrderProperty()) || pageable.getOrderDirection() == null)
                        && CollectionUtils.isEmpty(pageable.getOrders()))) {
            criteriaQuery.orderBy(criteriaBuilder.desc(root.get("isTop")),
                    criteriaBuilder.desc(root.get("createDate")));
        }
        return super.findPage(criteriaQuery, pageable);
    }

}