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 | } |