/** * Copyright (c)2010-2011 Enterprise Website Content Management System(EWCMS), All rights reserved. * EWCMS PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * http://www.ewcms.com */ package com.ewcms.common.query.jpa; import java.util.Arrays; import java.util.Collection; import javax.persistence.EntityManager; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; import com.ewcms.common.query.Result; import com.ewcms.common.query.cache.CacheResultable; import com.ewcms.common.query.cache.ResultCacheable; /** * * @author wangwei */ public class EntityQuery extends AbstractQuery implements EntityQueryable { private ResultCacheable cache; private EntityQueryTemplate listTemplate; private EntityQueryTemplate countTemplate; private EntityQueryTemplate extTemplate; private int row = DEFAULT_ROW ; private int page = DEFAULT_PAGE ; public EntityQuery(EntityManager em,Class<?> entityClass){ this(em,entityClass,null); } public EntityQuery(EntityManager em,Class<?> entityClass,SelectCallback extSelectCallback){ this(em,entityClass,null,extSelectCallback); } public EntityQuery(EntityManager em,Class<?> entityClass,SelectCallback countSelectCallback,SelectCallback extSelectCallback){ listTemplate = new EntityQueryTemplate(em,entityClass); if(countSelectCallback != null){ countTemplate = new EntityQueryTemplate(em,entityClass); countTemplate.select(countSelectCallback); }else{ countTemplate = new EntityQueryTemplate(em,entityClass); countTemplate.select(new SelectCallback(){ @Override public Selection<?> select(CriteriaBuilder builder, Root<?> root) { return builder.count(root); } }); } if(extSelectCallback != null){ extTemplate = new EntityQueryTemplate(em,entityClass).select(extSelectCallback); } } @Override public Result queryResult(){ return getResult(countTemplate,listTemplate,extTemplate,row,page); } @Override public CacheResultable queryCacheResult(String cacheKey) { return getCacheResult(cache,cacheKey, countTemplate,listTemplate,extTemplate, row,page); } @Override public EntityQueryable eq(String name, Object value) { listTemplate.eq(name, value); countTemplate.eq(name, value); if(extTemplate != null){ extTemplate.eq(name, value); } return this; } @Override public EntityQueryable notEq(String name, Object value) { listTemplate.notEq(name, value); countTemplate.notEq(name, value); if(extTemplate != null){ extTemplate.notEq(name, value); } return this; } @Override public EntityQueryable gt(String name, Number value) { listTemplate.gt(name, value); countTemplate.gt(name, value); if(extTemplate != null){ extTemplate.gt(name, value); } return this; } @Override public EntityQueryable ge(String name, Number value) { listTemplate.ge(name, value); countTemplate.ge(name, value); if(extTemplate != null){ extTemplate.ge(name, value); } return this; } @Override public EntityQueryable lt(String name, Number value) { listTemplate.lt(name, value); countTemplate.lt(name, value); if(extTemplate != null){ extTemplate.lt(name, value); } return this; } @Override public EntityQueryable le(String name, Number value) { listTemplate.le(name, value); countTemplate.le(name, value); if(extTemplate != null){ extTemplate.le(name, value); } return this; } @Override public EntityQueryable likeStart(String name, String value) { listTemplate.likeStart(name, value); countTemplate.likeStart(name, value); if(extTemplate != null){ extTemplate.likeStart(name, value); } return this; } @Override public EntityQueryable likeAnywhere(String name, String value) { listTemplate.likeAnywhere(name, value); countTemplate.likeAnywhere(name, value); if(extTemplate != null){ extTemplate.likeAnywhere(name, value); } return this; } @Override public EntityQueryable likeEnd(String name, String value) { listTemplate.likeEnd(name, value); countTemplate.likeEnd(name, value); if(extTemplate != null){ extTemplate.likeEnd(name, value); } return this; } @Override public <Y extends Comparable<? super Y>> EntityQueryable between(String name, Y lo, Y hi) { listTemplate.between(name, lo,hi); countTemplate.between(name, lo,hi); if(extTemplate != null){ extTemplate.between(name, lo,hi); } return this; } @Override public EntityQueryable in(String name, Collection<?> value) { listTemplate.in(name, value); countTemplate.in(name, value); if(extTemplate != null){ extTemplate.in(name, value); } return this; } @Override public EntityQueryable in(String name, Object[] value) { return in(name,Arrays.asList(value)); } @Override public EntityQueryable isNull(String name) { listTemplate.isNull(name); countTemplate.isNull(name); if(extTemplate != null){ extTemplate.isNull(name); } return this; } @Override public EntityQueryable isNotNull(String name) { listTemplate.isNotNull(name); countTemplate.isNotNull(name); if(extTemplate != null){ extTemplate.isNotNull(name); } return this; } @Override public EntityQueryable and() { listTemplate.and(); countTemplate.and(); if(extTemplate != null){ extTemplate.and(); } return this; } @Override public EntityQueryable and(Predicatesable x) { listTemplate.and(x); countTemplate.and(x); if(extTemplate != null){ extTemplate.and(x); } return this; } @Override public EntityQueryable or() { listTemplate.or(); countTemplate.or(); if(extTemplate != null){ extTemplate.or(); } return this; } @Override public EntityQueryable or(Predicatesable x) { listTemplate.or(x); countTemplate.or(x); if(extTemplate != null){ extTemplate.or(x); } return this; } @Override public EntityQueryable not(Predicatesable x) { listTemplate.not(x); countTemplate.not(x); if(extTemplate != null){ extTemplate.not(x); } return null; } @Override public EntityQueryable orderAsc(String name) { listTemplate.orderAsc(name); return this; } @Override public EntityQueryable orderDesc(String name) { listTemplate.orderDesc(name); return this; } @Override public EntityQueryable setCache(ResultCacheable cache){ this.cache = cache; return this; } @Override public EntityQueryable setRow(int row) { this.row = row; return this; } @Override public EntityQueryable setPage(int page) { this.page = page; return this; } }