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; }
}</pre>