⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractdaohibernate.java

📁 基于java的组号查询模块
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/**
 * 
 */
package com.lily.dap.dao.hibernate;

import java.io.Serializable;
import java.lang.reflect.Method;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.type.Type;
import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.lily.dap.Constants;
import com.lily.dap.dao.Dao;
import com.lily.dap.dao.QueryCallback;
import com.lily.dap.dao.TransitionCallback;
import com.lily.dap.dao.support.DaoHelper;
import com.lily.dap.model.QueryCondition;
import com.lily.dap.model.QueryExpression;
import com.lily.dap.model.QueryOrder;

/**
 * @author zouxuemo
 *
 */
public class AbstractDaoHibernate extends HibernateDaoSupport implements Dao {
    protected final Log logger = LogFactory.getLog(getClass());

	/* (non-Javadoc)
	 * @see com.lily.dap.dao.BasetDao#get(java.lang.Class, java.io.Serializable)
	 */
	public Object get(Class clazz, Serializable id)
			throws ObjectRetrievalFailureException {
        Object o = getHibernateTemplate().get(clazz, id);

        if (o == null) {
        	logger.warn("给定id为[" + id + "]的" + clazz.getName() + "对象没找到...");
            throw new ObjectRetrievalFailureException(clazz, id);
        }

        return o;
	}

	/* (non-Javadoc)
	 * @see com.lily.dap.dao.BasetDao#save(java.lang.Object)
	 */
	public void save(Object o) {
        getHibernateTemplate().saveOrUpdate(o);
	}

	/* (non-Javadoc)
	 * @see com.lily.dap.dao.BasetDao#remove(java.lang.Class, java.io.Serializable)
	 */
	public void remove(Class clazz, Serializable id)
			throws ObjectRetrievalFailureException {
		remove(get(clazz, id));
	}
	
	public void remove(Object entity) {
		getHibernateTemplate().delete(entity);
	}

	/* (non-Javadoc)
	 * @see com.lily.dap.dao.BasetDao#reload(java.lang.Object)
	 */
	public void reload(Object object) {
        getHibernateTemplate().refresh(object);
	}

	/* (non-Javadoc)
	 * @see com.lily.dap.dao.BasetDao#gets(java.lang.Class, com.lily.dap.model.QueryCondition)
	 */
	public List gets(Class clazz, QueryCondition queryCondition) {
		return gets(clazz, queryCondition, null);
	}

	/* (non-Javadoc)
	 * @see com.lily.dap.dao.BasetDao#gets(java.lang.Class, com.lily.dap.model.QueryCondition, com.lily.dap.model.QueryCallBack)
	 */
	public List gets(Class clazz, QueryCondition queryCondition, QueryCallback callBack) {
		String hql = parseQueryCondition(clazz, queryCondition, callBack);
		
		if ( logger.isDebugEnabled() ) {
			logger.debug("gets - [" + hql + "]...");
		}
		
		return executeFind(hql, queryCondition.getPageNo(), queryCondition.getPageSize());
	}
	
	public long count(Class clazz, QueryCondition queryCondition) {
		return count(clazz, queryCondition, null);
	}
	
	public long count(Class clazz, QueryCondition queryCondition, QueryCallback callBack) {
		String hql = parseQueryCondition(clazz, queryCondition, callBack);
		
		int index = hql.indexOf("group by");
		if (index < 0)
			index = hql.indexOf("order by");
		
		if (index >= 0)
			hql = hql.substring(0, index);
			
		hql = "select count(*) " + hql.substring(hql.indexOf("from"));
		
		if ( logger.isDebugEnabled() ) {
			logger.debug("count - [" + hql + "]...");
		}
		
		List result =  executeFind(hql);
		long count = 0;
		if (result.size() > 0)
			count = ((Long)result.get(0)).longValue();
		
		return count;
	}
	
	private String parseQueryCondition(Class clazz, QueryCondition queryCondition, QueryCallback callBack) {
		StringBuffer buf = new StringBuffer();
		
		//如果指定了要返回的字段,则构造选择字段的HQL语句
		if (queryCondition.getSelects() != null && queryCondition.getSelects().length > 0) {
			String[] selects = queryCondition.getSelects();
			buf.append("select ").append(selects[0]);
			
			for (int i = 1; i < selects.length; i++)
				buf.append(",").append(selects[i]);
			
			buf.append(" ");
		}
			
		buf.append("from ").append(clazz.getName()).append(" where ");
		
		//从查询表达式列表读取查询表达式,检查表达式字段是否属于类中的属性值,检查表达式操作是否支持,构造HQL条件语句
		queryCondition.beginFindCondition();
		QueryExpression expression;
		while ((expression = queryCondition.findNextCondition()) != null) {
			if (callBack != null) {
				String cond = callBack.parseCondition(expression);
				if (cond != null && !"".equals(cond)){
					if (!QueryCallback.IGRONE.equals(cond))
						buf.append(cond).append(" and ");
					
					continue;
				}
			}
			
			String name = expression.getName();
			
			Class type;
			Method method = null;
			try {
				method = DaoHelper.getMethod(clazz, name);
			} catch (SecurityException e) {
				logger.warn("给定的查询字段[" + name + "]在[" + clazz.getName() + "]类中不允许操作!");
				continue;
			} catch (NoSuchMethodException e) {
				logger.warn("给定的查询字段[" + name + "]在[" + clazz.getName() + "]类中不存在!");
				continue;
			}
			
			type = method.getReturnType();
			String expressionType = expression.getType();
			
			boolean isSingleQuotesFlag = false;
			if (expressionType != null) {
				if(QueryExpression.TYPE_STRING.equals(expressionType) || QueryExpression.TYPE_DATE.equals(expressionType))
					isSingleQuotesFlag = true;
			} else if (type == String.class || type == Date.class || type == Time.class || type == Timestamp.class) {
				isSingleQuotesFlag = true;
			}
			
			String value = DaoHelper.expressionValue2String(expression.getValue());

			//如果是数值型,则如果条件值为Constants.RETRIEVE_ALL时忽略该条件。如果是字符串型,则如果条件值为空字符串时忽略该条件
			if ("long".equals(type.getName()) || "int".equals(type.getName()) || type == Long.class || type == Integer.class) {
				if (value.equals(String.valueOf(Constants.RETRIEVE_ALL)))
					continue;
			} else if (type == String.class) {
				if ("".equals(value))
					continue;
			}
			
			//其他类型就要求提供查询值
			if ("".equals(value)) {
				logger.warn("给定的查询字段[" + name + ":" + type.getName() + "]必须输入查询条件值!");
				continue;
			}
			
			String op = expression.getOp(); 
			if (QueryExpression.OP_EQ.equals(op) || 
				QueryExpression.OP_NE.equals(op) || 
				QueryExpression.OP_GE.equals(op) || 
				QueryExpression.OP_GT.equals(op) ||
				QueryExpression.OP_LE.equals(op) || 
				QueryExpression.OP_LT.equals(op)) {
				buf.append(name).append(" ").append(op).append(" ");
				if (isSingleQuotesFlag)
					buf.append("'").append(value).append("'");
				else
					buf.append(value);
				buf.append(" and ");
			} else if (QueryExpression.OP_LIKE.equals(op)) {
				buf.append(name).append(" like '%").append(value).append("%' and ");
			} else if (QueryExpression.OP_LLIKE.equals(op)) {
				buf.append(name).append(" like '%").append(value).append("' and ");
			} else if (QueryExpression.OP_RLIKE.equals(op)) {
				buf.append(name).append(" like '").append(value).append("%' and ");
			} else if (QueryExpression.OP_IN.equals(op) || QueryExpression.OP_NOTIN.equals(op)) {
				if (QueryExpression.OP_IN.equals(op))
					buf.append(name).append(" in (");
				else
					buf.append(name).append(" not in (");
				
				StringTokenizer valuest = new StringTokenizer(value, QueryExpression.VALUE_SPLIT);
				int c = 0;
				while (valuest.hasMoreTokens()) {
					String val = valuest.nextToken();

					if (c++ > 0)
						buf.append(", ");
						
					if (isSingleQuotesFlag)
						buf.append("'").append(val).append("'");
					else
						buf.append(val);
				}
				
				buf.append(") and ");
			} else if (QueryExpression.OP_INCLUDE.equals(op)) {
				int[] ary = DaoHelper.parseNumExpression(value);
				if (ary.length == 0) {
					logger.warn("给定的include查询操作值[" + value + "]格式错误!");
					continue;
				}
				
				buf.append(name).append(" in (").append(ary[0]);
				for (int i = 1; i < ary.length; i++)
					buf.append(", ").append(ary[0]);
				buf.append(") and ");
			} else if (QueryExpression.OP_INQUERY.equals(op)) {
				buf.append(name).append(" in (").append(value).append(") and ");
			} else {
				logger.warn("对" + name + "的查询操作[" + op + "]不可识别!");
				continue;
			}
		}
		
		if (" and ".equals(buf.substring(buf.length() - 5)))
			buf = buf.delete(buf.length() - 5, buf.length());
		else
			buf = buf.delete(buf.length() - 7, buf.length());
		
		if (queryCondition.getGroupbys() != null && queryCondition.getGroupbys().length > 0) {
			String[] groupbys = queryCondition.getGroupbys();
			buf.append(" group by ").append(groupbys[0]);
			
			for (int i = 1; i < groupbys.length; i++)
				buf.append(",").append(groupbys[i]);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -