KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > javabb > dao > hibernate > HibernateDAO


1 package org.javabb.dao.hibernate;
2
3 import java.sql.Connection JavaDoc;
4 import java.sql.SQLException JavaDoc;
5 import java.sql.Statement JavaDoc;
6 import java.text.MessageFormat JavaDoc;
7 import java.util.List JavaDoc;
8
9 import net.sf.hibernate.HibernateException;
10 import net.sf.hibernate.Query;
11 import net.sf.hibernate.Session;
12
13 import org.javabb.dao.DAOConstants;
14 import org.javabb.infra.Parser;
15 import org.javabb.vo.VOObject;
16 import org.springframework.dao.DataAccessResourceFailureException;
17 import org.springframework.orm.hibernate.HibernateCallback;
18 import org.springframework.orm.hibernate.support.HibernateDaoSupport;
19
20 /*
21  * Copyright 2004 JavaFree.org
22  *
23  * Licensed under the Apache License, Version 2.0 (the "License");
24  * you may not use this file except in compliance with the License.
25  * You may obtain a copy of the License at
26  *
27  * http://www.apache.org/licenses/LICENSE-2.0
28  *
29  * Unless required by applicable law or agreed to in writing, software
30  * distributed under the License is distributed on an "AS IS" BASIS,
31  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
32  * See the License for the specific language governing permissions and
33  * limitations under the License.
34  */

35
36 /**
37  * $Id: HibernateDAO.java,v 1.19.6.1.2.4 2006/08/01 22:30:41 daltoncamargo Exp $
38  * @author Dalton Camargo - <a HREF="mailto:dalton@javabb.org">dalton@javabb.org </a> <br>
39  * @author Ronald Tetsuo Miura
40  */

41 public class HibernateDAO extends HibernateDaoSupport implements DAOConstants {
42
43     // public Session session = HibernateTransactionInterceptor.session;
44
protected String JavaDoc pathVO = "org.javabb.vo.";
45
46     
47     /**
48      * Exclusão especificada por uma query
49      * @param query - Query a ser verificada para a exclusão
50      */

51     public void deleteFrom(String JavaDoc query) {
52         getHibernateTemplate().delete(Parser.replaceHQL(query));
53     }
54
55     /**
56      * @param vo - Nome da VO
57      * @param index Nome da coluna index a ser pesquisada
58      * @return - quantidade de registros encontrados na classe
59      */

60     protected Integer JavaDoc countRowsOfTable(final String JavaDoc vo, final String JavaDoc index) {
61         return (Integer JavaDoc) getHibernateTemplate().execute(new HibernateCallback() {
62             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
63                 return (Integer JavaDoc) session.iterate( //
64
MessageFormat.format("select count({0}) from {1}", //
65
new String JavaDoc[] { index, pathVO + vo })).next();
66             }
67         });
68     }
69
70     /**
71      * @param nmClass Nome da classe a ser pesquisada
72      * @param index Nome da coluna index a ser pesquisada
73      * @param whereEqualField Campo a ser comparado
74      * @param whereEqualValue Valor do campo a ser comparado
75      * @return Retorna o número de registros encontrados
76      */

77     protected Integer JavaDoc countRowsByWhere(
78         String JavaDoc nmClass,
79         String JavaDoc index,
80         String JavaDoc[] whereEqualField,
81         String JavaDoc[] whereEqualValue) {
82
83         String JavaDoc sql = MessageFormat.format("select count(tbl.{0}) from {1} as tbl ",
84             new Object JavaDoc[] { index, pathVO + nmClass });
85
86         /**
87          * Monta a cláusula where
88          */

89         String JavaDoc where = " where ";
90
91         for (int i = 0; i < whereEqualField.length; i++) {
92             where += (" tbl." + whereEqualField[i] + " = " + whereEqualValue[i] + " and");
93         }
94
95         where = where.substring(0, where.length() - 3);
96         sql += where;
97
98         final String JavaDoc finalSql = sql;
99
100         return (Integer JavaDoc) getHibernateTemplate().execute(new HibernateCallback() {
101             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
102                 return session.iterate(finalSql).next();
103             }
104         });
105     }
106
107     /**
108      * Carrega um VO que seja filho de VOObject
109      * @param obj - Vo a ser carregado
110      * @return - VO populado
111      */

112     protected VOObject load(VOObject obj) {
113         return (VOObject) getHibernateTemplate().load(obj.getClass(), obj.getId());
114     }
115
116     /**
117      * Executa uma consulta através de uma condição
118      * @param condicao - Query a ser pesquisada
119      * @return - Lista de objetos pesquisados
120      */

121     protected List JavaDoc getList(String JavaDoc condicao) {
122         final String JavaDoc finalCondicao = Parser.replaceHQL(condicao);
123         return getHibernateTemplate().executeFind(new HibernateCallback() {
124             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
125                 return session.createQuery(finalCondicao).list();
126             }
127         });
128     }
129
130     /**
131      * Executa uma query com parâmetros de paginação
132      * @param condicao - Query a ser pesquisada
133      * @param firstRes - Registro inicial
134      * @param maxRes - Máximo de registros
135      * @return - Lista contendo os objetos pesquisados
136      */

137     protected List JavaDoc getList(final String JavaDoc condicao, final int firstRes, final int maxRes) {
138         return getHibernateTemplate().executeFind(new HibernateCallback() {
139             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
140                 String JavaDoc cond = Parser.replaceHQL(condicao);
141                 Query q = session.createQuery(cond);
142                 q.setFirstResult(firstRes);
143                 q.setMaxResults(maxRes);
144                 return q.list();
145             }
146         });
147     }
148
149     /**
150      * Faz uma busca por Order By usando a paginação
151      * @param nmClass - Nome da classe a ser pesquisada
152      * @param orderBy - Array contendo os campos do objeto a serem ordenados
153      * @param ascDesc - Ordem que os arrays serão ordenados
154      * @param firstRes - Primeiro registro a ser selecionado
155      * @param maxRes - Máximo de registros que será retornado
156      * @return - Retorna todos objetos da classe
157      */

158     protected List JavaDoc findAll(
159         Class JavaDoc nmClass,
160         String JavaDoc[] orderBy,
161         String JavaDoc[] ascDesc,
162         int firstRes,
163         int maxRes) {
164
165         String JavaDoc sql = "from " + nmClass.getName() + " as tbl ";
166         String JavaDoc sqlOrderBy = " order by ";
167
168         for (int i = 0; i < orderBy.length; i++) {
169             sqlOrderBy += (" tbl." + orderBy[i] + " " + ascDesc[i] + ",");
170         }
171
172         sqlOrderBy = sqlOrderBy.substring(0, sqlOrderBy.length() - 1);
173         sql += sqlOrderBy;
174
175         return getList(sql, firstRes, maxRes);
176     }
177
178     /**
179      * @param nmClass - Nome da classe a ser pesquisada
180      * @param whereEqualField - Campo a ser comparado
181      * @param whereEqualValue - Valor do campo a ser comparado
182      * @param orderBy - Array contendo os campos do objeto a serem ordenados
183      * @param ascDesc - Ordem que os arrays serão ordenados
184      * @return - Retorna todos objetos da classe
185      */

186     protected List JavaDoc findAll(
187         Class JavaDoc nmClass,
188         String JavaDoc[] whereEqualField,
189         String JavaDoc[] whereEqualValue,
190         String JavaDoc[] orderBy,
191         String JavaDoc[] ascDesc) {
192
193         String JavaDoc sql = "from " + nmClass.getName() + " as tbl ";
194
195         /**
196          * Monta a cláusula where
197          */

198         String JavaDoc where = " where ";
199
200         for (int i = 0; i < whereEqualField.length; i++) {
201             where += (" tbl." + whereEqualField[i] + " = " + whereEqualValue[i] + " and");
202         }
203
204         where = where.substring(0, where.length() - 3);
205         sql += where;
206
207         /**
208          * Monta a cláusula OrderBy
209          */

210         String JavaDoc sqlOrderBy = " order by ";
211
212         for (int i = 0; i < orderBy.length; i++) {
213             sqlOrderBy += (" tbl." + orderBy[i] + " " + ascDesc[i] + ",");
214         }
215
216         sqlOrderBy = sqlOrderBy.substring(0, sqlOrderBy.length() - 1);
217
218         sql += sqlOrderBy;
219
220         return getList(sql);
221     }
222
223     /**
224      * @param nmClass - Nome da classe a ser pesquisada
225      * @param whereEqualField - Campo a ser comparado
226      * @param whereEqualValue - Valor do campo a ser comparado
227      * @param orderBy - Array contendo os campos do objeto a serem ordenados
228      * @param ascDesc - Ordem que os arrays serão ordenados
229      * @param firstRes - Primeiro registro a ser selecionado
230      * @param maxRes - Máximo de registros que será retornado
231      * @return - Retorna todos objetos da classe
232      */

233     protected List JavaDoc findAll(
234         Class JavaDoc nmClass,
235         String JavaDoc[] whereEqualField,
236         String JavaDoc[] whereEqualValue,
237         String JavaDoc[] orderBy,
238         String JavaDoc[] ascDesc,
239         int firstRes,
240         int maxRes) {
241
242         String JavaDoc sql = "from " + nmClass.getName() + " as tbl ";
243
244         /**
245          * Monta a cláusula where
246          */

247         String JavaDoc where = " where ";
248
249         for (int i = 0; i < whereEqualField.length; i++) {
250             where += (" tbl." + whereEqualField[i] + " = " + whereEqualValue[i] + " and");
251         }
252
253         where = where.substring(0, where.length() - 3);
254         sql += where;
255
256         /**
257          * Monta a cláusula OrderBy
258          */

259         String JavaDoc sqlOrderBy = " order by ";
260
261         for (int i = 0; i < orderBy.length; i++) {
262             sqlOrderBy += (" tbl." + orderBy[i] + " " + ascDesc[i] + ",");
263         }
264
265         sqlOrderBy = sqlOrderBy.substring(0, sqlOrderBy.length() - 1);
266
267         sql += sqlOrderBy;
268
269         List JavaDoc lst = this.getList(sql, firstRes, maxRes);
270
271         return lst;
272     }
273
274     /**
275      * Executa um comando SQL nativamente
276      * @param sql - Comando sql a ser executado
277      */

278     protected void executeSQL(final String JavaDoc sql) {
279         getHibernateTemplate().execute(new HibernateCallback() {
280             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
281                 session.clear();
282                 Connection JavaDoc cnn = session.connection();
283                 Statement JavaDoc stmt = cnn.createStatement();
284                 stmt.executeUpdate(sql);
285                 cnn.commit();
286                 return null;
287             }
288         });
289     }
290
291     /**
292      * @param c
293      * @param attributeName
294      * @param attributeValue
295      * @return object loaded
296      */

297     protected Object JavaDoc loadByUniqueAttribute(
298         final Class JavaDoc c,
299         final String JavaDoc attributeName,
300         final Object JavaDoc attributeValue) {
301         return getHibernateTemplate().execute(new HibernateCallback() {
302             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
303                 String JavaDoc queryString = MessageFormat.format("FROM {0} o WHERE {1} = :param",
304                     new Object JavaDoc[] { c.getName(), attributeName });
305                 Query query = session.createQuery(queryString);
306                 query.setParameter("param", attributeValue);
307                 return query.uniqueResult();
308             }
309         });
310     }
311
312     /**
313      * @param c
314      * @param attributeName
315      * @param attributeValue
316      * @return object loaded
317      */

318     protected List JavaDoc findByAttribute(
319         final Class JavaDoc c,
320         final String JavaDoc attributeName,
321         final Object JavaDoc attributeValue) {
322
323         String JavaDoc queryString = MessageFormat.format("FROM {0} o WHERE {1} = :param",
324             new Object JavaDoc[] { c.getName(), attributeName });
325         return getHibernateTemplate().findByNamedParam(queryString, "param", attributeValue);
326     }
327
328     /**
329      * @param c
330      * @param indexAttributeName pk field name
331      * @return - quantidade de registros encontrados na classe
332      */

333     protected int countRows(final Class JavaDoc c, final String JavaDoc indexAttributeName) {
334         return ((Integer JavaDoc) getHibernateTemplate().execute(new HibernateCallback() {
335             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
336                 String JavaDoc query = MessageFormat.format("SELECT COUNT(o.{0}) FROM {1} o",
337                     new String JavaDoc[] { indexAttributeName, c.getName() });
338                 return (Integer JavaDoc) session.createQuery(query).uniqueResult();
339             }
340         })).intValue();
341     }
342
343     /**
344      * @param c
345      * @param indexAttributeName pk field name
346      * @param whereClause
347      * @param params TODO
348      * @return - quantidade de registros encontrados na classe
349      */

350     protected int countRowsWhere(
351         final Class JavaDoc c,
352         final String JavaDoc indexAttributeName,
353         final String JavaDoc whereClause,
354         final Object JavaDoc[] params) {
355
356         return ((Integer JavaDoc) getHibernateTemplate().execute(new HibernateCallback() {
357             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
358                 String JavaDoc queryString = MessageFormat.format("SELECT COUNT({0}) FROM {1} o WHERE {2}", //
359
new String JavaDoc[] { indexAttributeName, c.getName(), whereClause });
360                 Query query = session.createQuery(queryString);
361                 if (params != null) {
362                     for (int i = 0; i < params.length; i++) {
363                         query.setParameter(i, params[i]);
364                     }
365                 }
366
367                 return (Integer JavaDoc) query.iterate().next();
368             }
369         })).intValue();
370     }
371
372     /**
373      * @param c
374      * @param where
375      * @param params
376      * @param orderBy
377      * @param pageNumber
378      * @param itemsPerPage
379      * @return result list
380      */

381     protected List JavaDoc find(
382         final Class JavaDoc c,
383         final String JavaDoc where,
384         final Object JavaDoc[] params,
385         final String JavaDoc orderBy,
386         final int pageNumber,
387         final int itemsPerPage) {
388
389         return getHibernateTemplate().executeFind(new HibernateCallback() {
390             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
391
392                 String JavaDoc hql = MessageFormat.format("FROM {0} o WHERE {1} ORDER BY {2}",
393                     new Object JavaDoc[] { c.getName(), where, orderBy });
394
395                 Query query = session.createQuery(hql);
396                 for (int i = 0; i < params.length; i++) {
397                     query.setParameter(i, params[i]);
398                 }
399                 if (pageNumber >= 0 && itemsPerPage > 0) {
400                     // avoid negative numbers
401
int firstResult = Math.max(0, pageNumber - 1) * itemsPerPage;
402                     query.setFirstResult(firstResult);
403                     query.setMaxResults(itemsPerPage);
404                 }
405                 return query.list();
406             }
407         });
408     }
409
410     
411     protected List JavaDoc find(
412             final String JavaDoc hql,
413             final Object JavaDoc[] params,
414             final int pageNumber,
415             final int itemsPerPage) {
416
417             return getHibernateTemplate().executeFind(new HibernateCallback() {
418                 public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
419
420                     Query query = session.createQuery(hql);
421                     for (int i = 0; i < params.length; i++) {
422                         query.setParameter(i, params[i]);
423                     }
424                     if (pageNumber >= 0 && itemsPerPage > 0) {
425                         // avoid negative numbers
426
int firstResult = Math.max(0, pageNumber - 1) * itemsPerPage;
427                         query.setFirstResult(firstResult);
428                         query.setMaxResults(itemsPerPage);
429                     }
430                     return query.list();
431                 }
432             });
433         }
434
435     
436     /**
437      * @param c
438      * @param orderBy
439      * @param pageNumber
440      * @param itemsPerPage
441      * @return result list
442      */

443     protected List JavaDoc findAll(
444         final Class JavaDoc c,
445         final String JavaDoc orderBy,
446         final int pageNumber,
447         final int itemsPerPage) {
448
449         return getHibernateTemplate().executeFind(new HibernateCallback() {
450             public Object JavaDoc doInHibernate(Session session) throws HibernateException, SQLException JavaDoc {
451
452                 String JavaDoc hql = MessageFormat.format("FROM {0} o ORDER BY {1}",
453                     new Object JavaDoc[] { c.getName(), orderBy });
454
455                 Query query = session.createQuery(hql);
456                 if (pageNumber >= 0 && itemsPerPage > 0) {
457                     query.setFirstResult(Math.max(0, pageNumber - 1) * itemsPerPage);
458                     query.setMaxResults(itemsPerPage);
459                 }
460                 return query.list();
461             }
462         });
463     }
464
465     protected String JavaDoc getFieldName(int i) {
466         return "";
467     }
468
469     /**
470      * @param c
471      * @param sortingFields
472      * @return
473      */

474     protected List JavaDoc findAll(Class JavaDoc c, int[] sortingFields) {
475         StringBuffer JavaDoc sb = new StringBuffer JavaDoc();
476         for (int i = 0; i < sortingFields.length; i++) {
477             if (sortingFields[i] > 0) {
478                 sb.append("o.");
479                 sb.append(getFieldName(sortingFields[i]));
480                 sb.append(" ASC");
481             } else if (sortingFields[i] < 0) {
482                 sb.append("o.");
483                 sb.append(getFieldName(-sortingFields[i]));
484                 sb.append(" DESC");
485             } else {
486                 throw new IllegalArgumentException JavaDoc("");
487             }
488             if (i + 1 < sortingFields.length) {
489                 sb.append(", ");
490             }
491         }
492         return findAll(c, sb.toString(), ALL_PAGES, ALL_PAGES);
493     }
494     
495     
496     /**
497      * @param obj
498      * @return
499      * @throws Exception
500      */

501     protected Object JavaDoc load(Class JavaDoc cls, Long JavaDoc id) {
502         try{
503             return getSession().load(cls, id);
504         }catch(Exception JavaDoc e){
505             System.out.println("Error at load of HibernateDAO:" + e);
506             return null;
507         }
508     }
509
510     
511     
512     public Object JavaDoc add(Object JavaDoc obj) throws Exception JavaDoc {
513         return getHibernateTemplate().save(obj);
514     }
515
516     public List JavaDoc loadAll(Object JavaDoc obj) throws Exception JavaDoc {
517         return getHibernateTemplate().loadAll(obj.getClass());
518     }
519
520     public Object JavaDoc load(Object JavaDoc obj, Long JavaDoc id) throws Exception JavaDoc {
521         return getHibernateTemplate().load(obj.getClass(), id);
522     }
523
524     public void delete(Object JavaDoc obj) throws Exception JavaDoc {
525         getHibernateTemplate().delete(obj);
526     }
527     
528 }
529
Popular Tags