package org.beanfuse.persist.impl;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.beanfuse.collection.page.Page;
import org.beanfuse.collection.page.PageLimit;
import org.beanfuse.entity.Model;
import org.beanfuse.entity.ModelBuilder;
import org.beanfuse.model.Entity;
import org.beanfuse.model.LongIdEntity;
import org.beanfuse.persist.EntityDao;
import org.beanfuse.persist.EntityService;
import org.beanfuse.query.AbstractQuery;
import org.hibernate.Criteria;
import org.hibernate.Query;
public class EntityServiceImpl implements EntityService {
protected EntityDao entityDao;
protected ModelBuilder modelBuilder;
public Entity load(Class clazz, Serializable id) {
return entityDao.load(clazz, id);
}
public List loadAll(Class entity) {
return entityDao.loadAll(entity);
}
public Entity get(Class clazz, Serializable id) {
return entityDao.get(clazz, id);
}
public Entity get(String entityName, Serializable id) {
return entityDao.get(entityName, id);
}
public List load(Class entity, String attr, Collection values) {
return entityDao.load(entity, attr, values.toArray());
}
public List load(Class entity, String attr, Object value) {
return entityDao.load(entity, attr, new Object[] { value });
}
public List load(Class entity, String attr, Object[] values) {
return entityDao.load(entity, attr, values);
}
public List load(String entityName, String attr, Object[] values) {
return entityDao.load(entityName, attr, values);
}
public List load(Class entity, String[] attrs, Object[] values) {
Map params = new HashMap();
for (int i = 0; i < attrs.length; i++) {
params.put(attrs[i], values[i]);
}
return load(entity, params);
}
/**
* @param entity
* @param parameterMap
* @return
*/
public List load(Class entity, final Map parameterMap) {
if (entity == null || parameterMap == null || parameterMap.isEmpty()) {
return Collections.EMPTY_LIST;
}
String entityName = entity.getName();
StringBuilder hql = new StringBuilder();
hql.append("select entity from ").append(entityName).append(" as entity ")
.append(" where ");
Set keySet = parameterMap.keySet();
Map m = new HashMap(keySet.size());
// 变量编号
int i = 0;
for (Iterator ite = keySet.iterator(); ite.hasNext();) {
String keyName = (String) ite.next();
if (StringUtils.isEmpty(keyName)) {
return null;
}
i++;
Object keyValue = parameterMap.get(keyName);
String[] tempName = StringUtils.split(keyName, "\\.");
String name = tempName[tempName.length - 1] + i;
m.put(name, keyValue);
if (keyValue != null
&& (keyValue.getClass().isArray() || keyValue instanceof Collection)) {
hql.append("entity.").append(keyName).append(" in (:").append(name)
.append(") and ");
} else {
hql.append("entity.").append(keyName).append(" = :").append(name).append(" and ");
}
}
hql.append(" (1=1) ");
return entityDao.searchHQLQuery(hql.toString(), m);
}
public List search(AbstractQuery query) {
return entityDao.search(query);
}
public Page paginateCriteria(Criteria criteria, PageLimit limit) {
return entityDao.paginateCriteria(criteria, limit);
}
public Page paginateHQLQuery(String hql, Map params, PageLimit limit) {
return entityDao.paginateHQLQuery(hql, params, limit);
}
public Page paginateNamedQuery(String queryName, Map params, PageLimit limit) {
return entityDao.paginateNamedQuery(queryName, params, limit);
}
public Page paginateQuery(Query query, Map params, PageLimit limit) {
return entityDao.paginateQuery(query, params, limit);
}
public List searchHQLQuery(String hql, Map params, boolean cacheable) {
return entityDao.searchHQLQuery(hql, params, cacheable);
}
public List searchHQLQuery(String hql, Map params) {
return entityDao.searchHQLQuery(hql, params);
}
public List searchHQLQuery(String hql, Object[] params) {
return entityDao.searchHQLQuery(hql, params);
}
public List searchHQLQuery(String hql) {
return entityDao.searchHQLQuery(hql);
}
public List searchNamedQuery(String queryName, Map params, boolean cacheable) {
return entityDao.searchNamedQuery(queryName, params, cacheable);
}
public List searchNamedQuery(String queryName, Map params) {
return entityDao.searchNamedQuery(queryName, params);
}
public List searchNamedQuery(String queryName, Object[] params) {
return entityDao.searchNamedQuery(queryName, params);
}
public int update(Class entityClass, String attr, Object[] values, String[] argumentName,
Object[] argumentValue) {
if (null == values || values.length == 0) {
return 0;
}
Map updateParams = new HashMap();
for (int i = 0; i < argumentValue.length; i++) {
updateParams.put(argumentName[i], argumentValue[i]);
}
return update(entityClass, attr, values, updateParams);
}
public int update(Class entityClass, String attr, Object[] values, Map updateParams) {
if (null == values || values.length == 0 || updateParams.isEmpty()) {
return 0;
}
String entityName = entityClass.getName();
StringBuilder hql = new StringBuilder();
hql.append("update ").append(entityName).append(" set ");
Set parameterNameSet = updateParams.keySet();
for (Iterator ite = parameterNameSet.iterator(); ite.hasNext();) {
String parameterName = (String) ite.next();
if (null == parameterName) {
continue;
}
hql.append(parameterName).append(" = ").append(":").append(
StringUtils.replaceChars(parameterName, '.', '_')).append(",");
}
hql.deleteCharAt(hql.length() - 1);
hql.append(" where ").append(attr).append(" in (:ids)");
updateParams.put("ids", values);
return entityDao.executeUpdateHql(hql.toString(), updateParams);
}
public void remove(Object entity) {
entityDao.remove(entity);
}
public void remove(Collection entities) {
if (null != entities && !entities.isEmpty()) {
entityDao.remove(entities);
}
}
public boolean remove(Class entityClass, Map parameterMap) {
return entityDao.remove(entityClass, parameterMap);
}
public boolean remove(Class entityClass, String attr, Collection values) {
return entityDao.remove(entityClass, attr, values);
}
public boolean remove(Class entityClass, String attr, Object[] values) {
return entityDao.remove(entityClass, attr, values);
}
public void saveOrUpdate(Collection entities) {
if (null != entities && !entities.isEmpty()) {
entityDao.saveOrUpdate(entities);
}
}
public void saveOrUpdate(Object entity) {
if (entity != null) {
entityDao.saveOrUpdate(entity);
}
}
public void saveOrUpdate(String entityName, Collection entities) {
entityDao.saveOrUpdate(entityName, entities);
}
public void saveOrUpdate(String entityName, Object entity) {
entityDao.saveOrUpdate(entityName, entity);
}
public int count(String entityName, String keyName, Object value) {
String hql = "select count(*) from " + entityName + " where " + keyName + "=:value";
Map params = new HashMap();
params.put("value", value);
List rs = entityDao.searchHQLQuery(hql, params);
if (rs.isEmpty()) {
return 0;
} else {
return ((Number) rs.get(0)).intValue();
}
}
public int count(Class entityClass, String keyName, Object value) {
return count(entityClass.getName(), keyName, value);
}
public int count(Class entityClass, String[] attrs, Object[] values, String countAttr) {
String entityName = entityClass.getName();
StringBuilder hql = new StringBuilder();
if (StringUtils.isNotEmpty(countAttr)) {
hql.append("select count(distinct ").append(countAttr).append(") from ");
} else {
hql.append("select count(*) from ");
}
hql.append(entityName).append(" as entity where ");
Map params = new HashMap();
for (int i = 0; i < attrs.length; i++) {
String keyName = (String) attrs[i];
if (StringUtils.isEmpty(keyName)) {
continue;
}
Object keyValue = values[i];
params.put(keyName, keyValue);
String[] tempName = StringUtils.split(attrs[i], "\\.");
attrs[i] = tempName[tempName.length - 1] + i;
if (keyValue != null
&& (keyValue.getClass().isArray() || keyValue instanceof Collection)) {
hql.append("entity.").append(keyName).append(" in (:").append(attrs[i]).append(
") and ");
} else {
hql.append("entity.").append(keyName).append(" = :").append(attrs[i]).append(
" and ");
}
}
hql.append(" (1=1) ");
return ((Number) entityDao.searchHQLQuery(hql.toString(), params).get(0)).intValue();
}
public boolean exist(Class entityClass, String attr, Object value) {
return count(entityClass, attr, value) > 0;
}
public boolean exist(String entityName, String attr, Object value) {
return count(entityName, attr, value) > 0;
}
public boolean exist(Class entity, String[] attrs, Object[] values) {
return (count(entity, attrs, values, null) > 0);
}
/**
* 检查持久化对象是否存在
*
* @param entityName
* @param keyName
* @param id
* @return boolean(是否存在) 如果entityId为空或者有不一样的entity存在则认为存在。
*/
public boolean duplicate(Class clazz, Long id, String codeName, Object codeValue) {
if (null != codeValue && StringUtils.isNotEmpty(codeValue.toString())) {
List list = entityDao.load(clazz, codeName, new Object[] { codeValue });
if (list != null && !list.isEmpty()) {
if (id == null) {
return true;
} else {
for (Iterator it = list.iterator(); it.hasNext();) {
Entity info = (Entity) it.next();
if (!info.getEntityId().equals(id)) {
return true;
}
}
return false;
}
}
}
return false;
}
public void initialize(Object entity) {
entityDao.initialize(entity);
}
public void refresh(Object entity) {
entityDao.refresh(entity);
}
public void evict(Object entity) {
entityDao.evict(entity);
}
public void setEntityDao(EntityDao entityDao) {
this.entityDao = entityDao;
}
public EntityDao getEntityDao() {
return entityDao;
}
public boolean duplicate(String entityName, Long id, Map params) {
StringBuilder b = new StringBuilder("from ");
b.append(entityName).append(" where (1=1)");
Map paramsMap = new HashMap();
int i = 0;
for (Iterator iterator = params.keySet().iterator(); iterator.hasNext(); i++) {
String key = (String) iterator.next();
b.append(" and ").append(key).append('=').append(":param" + i);
paramsMap.put("param" + i, params.get(key));
}
List list = entityDao.searchHQLQuery(b.toString(), paramsMap);
if (!list.isEmpty()) {
if (null == id) {
return false;
} else {
for (Iterator iter = list.iterator(); iter.hasNext();) {
LongIdEntity one = (LongIdEntity) iter.next();
if (!one.getId().equals(id)) {
return false;
}
}
}
}
return true;
}
protected Model getModel() {
return modelBuilder.getModel();
}
protected ModelBuilder getModelBuilder() {
return modelBuilder;
}
public void setModelBuilder(ModelBuilder modelBuilder) {
this.modelBuilder = modelBuilder;
}
}