package com.jspxcms.core.repository.impl; import java.util.Collections; import java.util.List; import javax.persistence.EntityManager; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.hibernate.ejb.QueryHints; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import com.jspxcms.common.orm.Limitable; import com.jspxcms.common.orm.QuerydslUtils; import com.jspxcms.core.domain.Node; import com.jspxcms.core.domaindsl.QNode; import com.jspxcms.core.repository.NodeDaoPlus; import com.mysema.query.BooleanBuilder; import com.mysema.query.jpa.impl.JPAQuery; import com.mysema.query.types.expr.BooleanExpression; /** * NodeDaoImpl * * @author liufang * */ public class NodeDaoImpl implements NodeDaoPlus { public List<Node> findList(Integer[] siteId, Integer parentId, String treeNumber, Boolean isRealNode, Boolean isHidden, Limitable limitable) { JPAQuery query = new JPAQuery(this.em); query.setHint(QueryHints.HINT_CACHEABLE, true); QNode node = QNode.node; predicate(query, node, siteId, parentId, treeNumber, isRealNode, isHidden); return QuerydslUtils.list(query, node, limitable); } public Page<Node> findPage(Integer[] siteId, Integer parentId, String treeNumber, Boolean isRealNode, Boolean isHidden, Pageable pageable) { JPAQuery query = new JPAQuery(this.em); query.setHint(QueryHints.HINT_CACHEABLE, true); QNode node = QNode.node; predicate(query, node, siteId, parentId, treeNumber, isRealNode, isHidden); return QuerydslUtils.page(query, node, pageable); } private void predicate(JPAQuery query, QNode node, Integer[] siteId, Integer parentId, String treeNumber, Boolean isRealNode, Boolean isHidden) { query.from(node); BooleanBuilder exp = new BooleanBuilder(); if (ArrayUtils.isNotEmpty(siteId)) { exp = exp.and(node.site.id.in(siteId)); } if (parentId != null) { exp = exp.and(node.parent.id.eq(parentId)); } if (StringUtils.isNotBlank(treeNumber)) { exp = exp.and(node.treeNumber.startsWith(treeNumber)); } if (isRealNode != null) { exp = exp.and(node.realNode.eq(isRealNode)); } if (isHidden != null) { exp = exp.and(node.hidden.eq(isHidden)); } query.where(exp); } public List<Node> findByNumbersLike(String[] numbers) { if (ArrayUtils.isEmpty(numbers)) { return Collections.emptyList(); } JPAQuery query = new JPAQuery(this.em); query.setHint(QueryHints.HINT_CACHEABLE, true); QNode node = QNode.node; query.from(node); BooleanExpression exp = node.number.like(numbers[0]); for (int i = 0, len = numbers.length; i < len; i++) { exp.or(node.number.like(numbers[i])); } query.where(exp); return query.list(node); } public List<Node> findByNumbers(String[] numbers) { if (ArrayUtils.isEmpty(numbers)) { return Collections.emptyList(); } JPAQuery query = new JPAQuery(this.em); query.setHint(QueryHints.HINT_CACHEABLE, true); QNode node = QNode.node; query.from(node); BooleanExpression exp = node.number.eq(numbers[0]); for (int i = 1, len = numbers.length; i < len; i++) { exp = exp.or(node.number.eq(numbers[i])); } query.where(exp); return query.list(node); } private EntityManager em; @javax.persistence.PersistenceContext public void setEm(EntityManager em) { this.em = em; } }