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

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
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;
    }   
     
}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇: javascript 的MD5代码备份,跟java互通

下一篇:android-async-http实现下载和上传