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