001	import java.io.*; 002	import java.sql.SQLException; 003	import java.util.ArrayList; 004	import java.util.List; 005	  006	import org.hibernate.Hibernate; 007	import org.hibernate.HibernateException; 008	import org.hibernate.Query; 009	import org.hibernate.SQLQuery; 010	import org.hibernate.Session; 011	import org.hibernate.Transaction; 012	import org.hibernate.type.Type; 013	import org.springframework.orm.hibernate3.HibernateCallback; 014	import org.springframework.orm.hibernate3.support.HibernateDaoSupport; 015	  016	public class GenericDao extends HibernateDaoSupport{ 017	    private ThreadLocal<Session> sessions = new ThreadLocal<Session>(); 018	    private ThreadLocal<Transaction> transactions = new ThreadLocal<Transaction>(); 019	    public synchronized Session getMySession(){ 020	        Session session = sessions.get(); 021	        if(session==null){ 022	            session = getSession(); 023	            transactions.set(session.beginTransaction()); 024	            sessions.set(session); 025	        }else 026	        if(!session.isOpen()){ 027	            session = getSession(); 028	            transactions.set(session.beginTransaction()); 029	            sessions.set(session); 030	        } 031	        return session; 032	    } 033	    public synchronized void commitMySession(){ 034	        Session session = sessions.get(); 035	        if(session!=null&&session.isOpen()){ 036	            transactions.get().commit(); 037	            session.close(); 038	        } 039	        transactions.remove(); 040	        sessions.remove(); 041	    } 042	    public synchronized void rollbackMySession(){ 043	        Session session = sessions.get(); 044	        if(session!=null&&session.isOpen()){ 045	            transactions.get().rollback(); 046	            session.close(); 047	        } 048	        transactions.remove(); 049	        sessions.remove(); 050	    } 051	    public <T> T get(Class<T> clazz, Serializable id){ 052	        return (T)getHibernateTemplate().get(clazz, id); 053	    } 054	    public <T> T load(Class<T> clazz, Serializable id){ 055	        return (T)getHibernateTemplate().load(clazz, id); 056	    } 057	    public <T> void save(T entity){ 058	//        System.out.println("---->gdao.save("+entity.getClass().getName()+")----"); 059	        getHibernateTemplate().save(entity); 060	    } 061	    public <T> void update(T entity){ 062	        getHibernateTemplate().update(entity); 063	    } 064	    public <T> void delete(T entity){ 065	        getHibernateTemplate().delete(entity); 066	    } 067	     068	    public int execUpdateSQL(String sql, Serializable...values){ 069	        Session sess = getMySession(); 070	        SQLQuery query = sess.createSQLQuery(sql); 071	        if(values!=null&&values.length>0){ 072	            for(int i=0; i<values.length; i++){ 073	                query.setParameter(i, values[i]); 074	            } 075	        } 076	        return query.executeUpdate(); 077	    } 078	    public Long getFirstLong(String sql, final Serializable... values) throws Exception{ 079	        List<String> params = new ArrayList<String>(1); 080	        List<Type> types = new ArrayList<Type>(1); 081	        params.add("c"); types.add(Hibernate.INTEGER); 082	        Object obj = findUnique(sql, params, types, values); 083	        if(obj==null){ 084	            return -1L; 085	        } 086	        if(obj instanceof Object[]){ 087	            obj = ((Object[])obj)[0]; 088	        } 089	        if(obj instanceof Number){ 090	            return ((Number)obj).longValue(); 091	        } 092	        return -1L; 093	    } 094	//    public Long getFirstLong(String sql,  List<String>params, List<Type>types) throws Exception{ 095	//        Object[] obj = findUnique(sql, params, types); 096	//        if(obj==null||obj.length==0){ 097	//            return -1L; 098	//        } 099	//        Object object = obj[0]; 100	//        if(object instanceof Number){ 101	//            return ((Number)object).longValue(); 102	//        } 103	//        return -1L; 104	//    } 105	    public List<?> find(String hql){ 106	        return getHibernateTemplate().find(hql); 107	    } 108	//    public List<?> find(String hql, final Object...values){ 109	//        logger.info(hql); 110	//        return getHibernateTemplate().find(hql, values); 111	//    } 112	     113	    public <T> List<T> findByPage(Class<T> clazz, final int start, final int limit, final String where, final Serializable... values){ 114	        String hql = "from " + clazz.getName() + " as e"; 115	        if(where!=null&&where.length()>0){ 116	            hql += " where " + where; 117	        } 118	        final String fHql = hql; 119	        return getHibernateTemplate().executeFind(new HibernateCallback(){ 120	  121	            public Object doInHibernate(Session session) 122	                    throws HibernateException, SQLException { 123	                Query q = session.createQuery(fHql); 124	                if(values!=null&&values.length>0){ 125	                    for(int i=0; i<values.length; i++){ 126	                        q.setParameter(i, values[i]); 127	                    } 128	                } 129	                q.setFirstResult(start).setMaxResults(limit); 130	                return q.list(); 131	            } 132	             133	        }); 134	    } 135	    public <T> List<T> find(Class<T> clazz, final String where, final Serializable... values){ 136	        String hql = "from " + clazz.getSimpleName()+" as e"; 137	        if(where!=null&&where.length()>0){ 138	            hql += " where " + where; 139	        } 140	        return getHibernateTemplate().find(hql, values); 141	    } 142	    public long getTotalCountByHql(Class<?> clazz, final String where, final Serializable... values) throws Exception { 143	        String hql = "select count(*) from " + clazz.getSimpleName()+" as e"; 144	        if(where!=null&&where.length()>0){ 145	            hql += " where " + where; 146	        } 147	        List<Number> cs = getHibernateTemplate().find(hql, values); 148	        if(cs!=null&&cs.size()>0){ 149	            Number n = cs.get(0); 150	            return n.longValue(); 151	        } 152	        return 0; 153	    } 154	    public long getTotalCount(Class<?> clazz, final String where, final Serializable... values) throws Exception { 155	        String sql = "select count(1) as c from " + clazz.getSimpleName() + " e"; 156	        if(where!=null&&where.length()>0){ 157	            sql += " where " + where; 158	        } 159	        return getFirstLong(sql, values); 160	    } 161	     162	    public long getTotalCount(String sql, final Serializable... values) throws Exception { 163	        return getFirstLong(sql, values).longValue(); 164	    } 165	    public Object[] findUnique(final String sql,  List<String>params, List<Type>types, final Serializable...values) { 166	        Session sess = getMySession(); 167	        logger.debug("------findUnique.getSession()! sess="+sess.hashCode()); 168	        SQLQuery query = sess.createSQLQuery(sql); 169	        for(int j=0; j<params.size(); j++){ 170	            query.addScalar(params.get(j), types.get(j)); 171	        } 172	        if(values!=null&&values.length>0){ 173	            for(int i=0; i<values.length; i++){ 174	                query.setParameter(i, values[i]); 175	            } 176	        } 177	        query.setMaxResults(1); 178	        List<?> list = query.list(); 179	        if(list==null||list.size()==0){ 180	            return null; 181	        } 182	        Object obj = list.get(0); 183	        if(obj==null){ 184	            return null; 185	        } 186	        logger.debug("obj.type="+obj.getClass().getName()); 187	        if(!obj.getClass().isArray()){//如果返回值不是数组,则要进行相关的处理 188	            if(obj instanceof Number){ 189	                if(obj instanceof Long){ 190	                    return new Long[]{(Long)(obj)}; 191	                } 192	                if(obj instanceof Integer){ 193	                    return new Long[]{new Long((Integer)obj)}; 194	                } 195	                return new Number[]{(Number)obj}; 196	            } 197	            return new Object[]{obj}; 198	        } 199	        return (Object[])obj; 200	    } 201	    public List<Object[]> find(final String sql, List<String>params, List<Type>types, final Serializable... values) { 202	        Session sess = getMySession(); 203	        logger.debug("------find.getSession()! sess="+sess.hashCode()); 204	        SQLQuery query = sess.createSQLQuery(sql); 205	         206	        for(int j=0; j<params.size(); j++){ 207	            query.addScalar(params.get(j), types.get(j)); 208	        } 209	        if(values!=null&&values.length>0){ 210	            for(int i=0; i<values.length; i++){ 211	                query.setParameter(i, values[i]); 212	            } 213	        } 214	        return query.list(); 215	    } 216	    public long getNextId(String sequence) throws Exception{ 217	        String sql = "select "+sequence+".nextval as nextid from dual"; 218	  219	        Session sess = getMySession(); 220	        logger.debug("------generateId.getSession()! sess="+sess.hashCode()); 221	        SQLQuery query = sess.createSQLQuery(sql); 222	        query.addScalar("nextid", Hibernate.LONG); 223	        List<?> list = query.list(); 224	        if(list==null||list.size()==0){ 225	            return -1L; 226	        } 227	        Object obj = list.get(0); 228	        logger.debug("obj.type="+obj.getClass().getName()); 229	        if(obj instanceof Number){ 230	            return ((Number)obj).longValue(); 231	        } 232	        return -1L; 233	    } 234	    public boolean exists(String sql, final Object...values) throws Exception{ 235	        Session sess = getMySession(); 236	        logger.debug("------exists.getSession()! sess="+sess.hashCode()); 237	        SQLQuery query = sess.createSQLQuery(sql); 238	        for(int i=0; i<values.length; i++){ 239	            query.setParameter(i, values[i]); 240	        } 241	        List<?> list = query.list(); 242	        if(list==null||list.size()==0){ 243	            return false; 244	        } 245	        return true; 246	    } 247	  248	}