View Javadoc

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  							// TODO esto lo probe para una sola clase x.y no se
88  							// si para mas
89  							// sigue andando
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);// chau
104 						// lazy
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 }