ssh框架中通用的原生SQL查询基类支持,方便进行双orm操作

package com.common;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;


/**
 * 通用的SQL查询基类
 */
public class BaseGeneralQuery extends AbstractHibernateDAOImpl {
	
	/**
	 * 通用的SQL查询方法(返回多条记录)
	 * 
	 *     SQL:SQL语句,切记必须指定查询字段,不可使用通配 *
	 * sqlType:SQL(原生SQL)、HQL(HQL语句)
	 *     
	 *  List对应每一条记录,Map的put中对应中每一个字段、值。SQL语句,应规范SQL语句,HQL最好兼容SQL的写法.
	 *  解析Map的时候,需要通过查询字段对应的下标获取,从0开始。如:maps.get(0).toString();
	 */
	public List<Map> executeQuery(String sqlType,String sql){
		List<Map> list=null;
		try {
			list = new LinkedList<Map>();
			Session session = this.getSession();
			Query query = null;
			
			if("SQL".equals(sqlType)){
				query = session.createSQLQuery(sql);
			}
			if("HQL".equals(sqlType)){
				query = session.createQuery(sql);
			}
			
			//String hqlstr = sql.toString().substring(6, sql.toString().indexOf("from")).trim();
			//String[] codenames = hqlstr.split(",");
			
			Map maps = null;
			Iterator it  = query.list().iterator();
			while(it.hasNext()){
				maps = new HashMap();
				Object[] obj = (Object[])it.next();
				//由于SQL或者是HQL语句的查询字段的复杂性和规范性,无法进行有效的截取判断。只能进行数据条字段下标进行通用封装。
				for(int i=0;i<obj.length;i++){
					maps.put(i, obj[i]==null?"":obj[i].toString());
				} 	
				list.add(maps);
			}
			
		} catch (Exception e) {
			System.out.println("#Error BaseGeneralQuery.executeQuery(String sqlType,String sql) ["+e.getMessage()+"] ");
		} 

		return list;
	}
	
	/**
	 * 通用的SQL查询方法(返回一条数据集合)
	 *     SQL:SQL语句(select aa,bb from table 	
	 *     返回根据语句查询到的记录对象Map映射
	 */
	public Map getObject(String sql){		
		Map map = null;
		try {
			List<Object[]> object = super.getSession(true).createSQLQuery(sql).list();
		
			if(object != null && object.size() >0 ){
				map = new HashMap();
				for(int j=0;j<object.get(0).length;j++){
					map.put(j, object.get(0)[j]);
				}
			}
			 
			super.getSession(true).close();
		} catch (Exception e) {
			System.out.println("#Error BaseGeneralQuery.getObject(String sql) ["+e.getMessage()+"] ");
		} 
		
		return map;
	}
	
	/**
	 * 通用的SQL查询方法(返回单个字段数据)
	 *   field: 单个查询语句的字段aa
	 *     SQL:SQL语句(select aa from table 	
	 *     返回根据语句查询到的记录对象Map映射
	 */
	public String getString(String field,String sql){
		String val  =  "";
		try {
			val = (String)super.getSession(true).createSQLQuery(sql).addScalar(field, Hibernate.STRING).uniqueResult();
			
			super.getSession(true).close();
		} catch (Exception e) {
			System.out.println("#Error BaseGeneralQuery.getString(String field,String sql) ["+e.getMessage()+"] ");
		} 
		return val;
	}
	
	/**
	 * 通用的SQL查询方法(返回记录条数)
	 * 
	 *     SQL:SQL语句,(select count(*) counts from table )
	 * sqlType:SQL(原生SQL)、HQL(HQL语句)
	 * 
	 *     返回根据语句查询到的记录条数
	 */
	public int executeQueryCount(String sqlType,String sql){
		int count = 0;
		try {
			Session session = this.getSession();
			
			if("SQL".equals(sqlType)){
				count = Integer.parseInt((String) session.createSQLQuery(sql).addScalar("counts",Hibernate.STRING).uniqueResult());
			}
			if("HQL".equals(sqlType)){
				count = session.createQuery(sql).list().size();
			}
			
		} catch (Exception e) {
			System.out.println("#Error BaseGeneralQuery.executeQueryCount(String sqlType,String sql) ["+e.getMessage()+"] ");
		} 

		return count;
	}	
	
	/**
	 * 通用的SQL添加方法
	 * 
	 *     SQL:SQL语句,(select count(*) counts from table )
	 * sqlType:SQL(原生SQL)、HQL(HQL语句)
	 * 
	 * 返回SQL语句受影响的行数
	 */
	public int executeSave(String sqlType,String sql){
		int count = 0;
		try {
			Session session = this.getSession();
			
			if("SQL".equals(sqlType)){
				count = session.createSQLQuery(sql).executeUpdate();
			}
			if("HQL".equals(sqlType)){
				//count = session.createQuery(sql).list().size();
			}
			
		} catch (Exception e) {
			System.out.println("#Error BaseGeneralQuery.executeSave(String sqlType,String sql) ["+e.getMessage()+"] ");
		} 
		
		return count;
	}	
	
}

你可能感兴趣的:(原生SQL)