/* * * Copyright c 2005-2009. * * Licensed under GNU LESSER General Public License, Version 3. * http://www.gnu.org/licenses * */ /******************************************************************************** * @author chaostone * * MODIFICATION DESCRIPTION * * Name Date Description * ============ ============ ============ * chaostone 2006-10-15 Created * ********************************************************************************/ package org.beanfuse.query; import org.apache.commons.lang.StringUtils; import org.beanfuse.entity.Model; import org.beanfuse.entity.types.EntityType; /** * 实体类查询 * * @author chaostone * */ public class EntityQuery extends SqlQuery { /** 查询实体类 */ protected Class entityClass; /** 实体类别名 */ protected String alias; public EntityQuery() { super(); } public EntityQuery(final String hql) { super(); this.queryStr = hql; } public EntityQuery(final String entityName, final String alias) { EntityType type = Model.getEntityType(entityName); this.entityClass = type.getEntityClass(); this.alias = alias; select = "select " + alias + " "; from = "from " + entityName + " " + alias; } public EntityQuery(final Class entityClass, final String alias) { super(); EntityType type = Model.getEntityType(entityClass.getName()); if (null == type) { type = Model.getEntityType(entityClass); } this.entityClass = type.getEntityClass(); this.alias = alias; select = "select " + alias + " "; from = "from " + type.getEntityName() + " " + alias; } public EntityQuery join(final String path, final String alias) { from += " join " + path + " " + alias; return this; } public EntityQuery join(final String joinMode, final String path, final String alias) { from += " " + joinMode + " join " + path + " " + alias; return this; } /** * 形成计数查询语句,如果不能形成,则返回"" */ public String toCountString() { if (StringUtils.isNotEmpty(countStr)) { return countStr; } StringBuilder countString = new StringBuilder("select count(*) "); // 原始查询语句 final String genQueryStr = genQueryString(false); if (StringUtils.isEmpty(genQueryStr)) { return ""; } final String lowerCaseQueryStr = genQueryStr.toLowerCase(); if (StringUtils.contains(lowerCaseQueryStr, " group ")) { return ""; } if (StringUtils.contains(lowerCaseQueryStr, " union ")) { return ""; } final int indexOfFrom = lowerCaseQueryStr.indexOf("from"); final String selectWhat = lowerCaseQueryStr.substring(0, indexOfFrom); final int indexOfDistinct = selectWhat.indexOf("distinct"); // select distinct a from table; if (-1 != indexOfDistinct) { if (StringUtils.contains(selectWhat, ",")) { return null; } else { countString = new StringBuilder("select count("); countString.append(genQueryStr.substring(indexOfDistinct, indexOfFrom)).append(')'); } } countString.append(genQueryStr.substring(indexOfFrom)); return countString.toString(); } public String getAlias() { return alias; } public void setAlias(final String alias) { this.alias = alias; } public Class getEntityClass() { return entityClass; } public void setEntityClass(final Class entityClass) { this.entityClass = entityClass; } }