1 /**
2 *
3 */
4 package ar.com.jiji.kaya.dao.hib;
5
6 import java.sql.SQLException;
7 import java.util.List;
8
9 import org.apache.commons.logging.Log;
10 import org.apache.commons.logging.LogFactory;
11 import org.hibernate.Criteria;
12 import org.hibernate.HibernateException;
13 import org.hibernate.Session;
14 import org.hibernate.criterion.Expression;
15 import org.hibernate.criterion.Order;
16 import org.hibernate.criterion.Projections;
17 import org.springframework.orm.hibernate3.HibernateCallback;
18 import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
19
20 import ar.com.jiji.kaya.dao.PageableTableDAO;
21 import ar.com.jiji.kaya.query.Query;
22 import ar.com.jiji.kaya.query.hib.HibernateQueryTranslator;
23
24 /**
25 * Implementacion para los dao de Hibernate 3 y Spring de PageableTableDAO.
26 *
27 * @author lparra
28 * @version $Revision$ $Date$
29 */
30 public class HibernatePageableImpl<T> implements PageableTableDAO<T> {
31
32 private static final Log log = LogFactory
33 .getLog(HibernatePageableImpl.class);
34
35 private HibernateDaoSupport dao;
36
37 private Class clazz;
38
39 public HibernatePageableImpl(HibernateDaoSupport dao, Class clazz) {
40 this.dao = dao;
41 this.clazz = clazz;
42 }
43
44 @SuppressWarnings("unchecked")
45 public int getSize() {
46 List<Integer> aux = dao.getHibernateTemplate().find(
47 "select count(*) from " + clazz.getName());
48 return aux.get(0);
49 }
50
51 public int getSize(final Query query) {
52 return (Integer) dao.getHibernateTemplate().execute(
53 new HibernateCallback() {
54
55 public Object doInHibernate(Session session)
56 throws HibernateException, SQLException {
57 Criteria cr = session.createCriteria(clazz);
58 if (query != null)
59 HibernateQueryTranslator.addQuery(cr, query);
60
61 cr.setProjection(Projections.rowCount());
62 return (Integer) cr.uniqueResult();
63 }
64 });
65
66 }
67
68 public List<T> getPage(int nFirst, int nPageSize, String sortColumn,
69 boolean bSortOrder) {
70 return getPage(nFirst, nPageSize, sortColumn, bSortOrder, null);
71 }
72
73 @SuppressWarnings("unchecked")
74 public List<T> getPage(final int nFirst, final int nPageSize,
75 final String sortColumn, final boolean bSortOrder,
76 final Object master) {
77 return (List<T>) dao.getHibernateTemplate().execute(
78 new HibernateCallback() {
79
80 public Object doInHibernate(Session session)
81 throws HibernateException, SQLException {
82 Criteria cr = session.createCriteria(clazz);
83 if (master != null)
84 cr = cr.add(Expression.eq("master", master));
85
86 if (sortColumn != null) {
87
88
89
90 String[] path = sortColumn.split("\\.");
91 for (int i = 0; i < path.length - 1; i++)
92 cr = cr.createCriteria(path[i]);
93 if (bSortOrder)
94 cr.addOrder(Order.desc(path[path.length - 1]));
95 else
96 cr.addOrder(Order.asc(path[path.length - 1]));
97 }
98
99 cr.setFirstResult(nFirst).setMaxResults(nPageSize);
100 log.debug("tamaño " + cr.list().size() + ", first"
101 + nFirst + ", size " + nPageSize + ", sortcol "
102 + sortColumn + ", order " + bSortOrder
103 + ", cl " + master + ", clazz " + clazz);
104
105 return cr.list();
106 }
107
108 });
109 }
110
111 @SuppressWarnings("unchecked")
112 public List<T> getPage(final int nFirst, final int nPageSize,
113 final String sortColumn, final boolean bSortOrder, final Query query) {
114 return (List<T>) dao.getHibernateTemplate().execute(
115 new HibernateCallback() {
116
117 public Object doInHibernate(Session session)
118 throws HibernateException, SQLException {
119 Criteria cr = session.createCriteria(clazz);
120 if (query != null)
121 HibernateQueryTranslator.addQuery(cr, query);
122
123 if (sortColumn != null) {
124 if (bSortOrder)
125 cr.addOrder(Order.desc(sortColumn));
126 else
127 cr.addOrder(Order.asc(sortColumn));
128 }
129
130 cr.setFirstResult(nFirst).setMaxResults(nPageSize);
131 log.debug("tamaño " + cr.list().size() + ", first"
132 + nFirst + ", size " + nPageSize + ", sortcol "
133 + sortColumn + ", order " + bSortOrder
134 + ", query " + query + ", clazz " + clazz);
135 return cr.list();
136 }
137 });
138 }
139 }