View Javadoc

1   package ar.com.jiji.kaya.query.hib;
2   
3   import org.hibernate.Criteria;
4   import org.hibernate.Hibernate;
5   import org.hibernate.criterion.Criterion;
6   import org.hibernate.criterion.Restrictions;
7   
8   import ar.com.jiji.kaya.query.Query;
9   import ar.com.jiji.kaya.query.QueryItem;
10  
11  /**
12   * Convierte una instancia de Query a una consulta Hibernate.
13   * 
14   * @author lparravicini
15   * @version $Id: HibernateQueryTranslator.java 71 2005-09-08 20:03:22Z
16   *          lparravicini $
17   * 
18   */
19  public class HibernateQueryTranslator {
20  
21  	private HibernateQueryTranslator() {
22  	}
23  
24  	public static Criteria addQuery(Criteria criteria, Query query) {
25  		for (QueryItem item : query.getQuery())
26  			criteria = addCriteria(criteria, item);
27  		// temita de los ORs
28  		criteria = addPath(criteria, query);
29  
30  		for (Query q : query.getOrQuerys()) {
31  			Criterion t = null;
32  			if (q.getQuery().size() > 1)
33  				t = getCriterion(criteria, q.getQuery().get(0));
34  			for (QueryItem orItem : q.getQuery()) {
35  				t = Restrictions.or(t, getCriterion(criteria, orItem));
36  			}
37  			criteria = criteria.add(t);
38  		}
39  
40  		return criteria;
41  	}
42  
43  	private static Criteria addPath(Criteria criteria, Query query) {
44  		for (int i = 0; i < query.getAllowedCols().size(); i++) {
45  			String[] path = ((String) query.getAllowedCols().values().toArray()[i])
46  					.split("\\.");
47  			for (int j = 0; j < path.length - 1; j++)
48  				criteria = criteria.createAlias(path[j], path[j]);
49  
50  		}
51  		return criteria;
52  	}
53  
54  	private static Criteria addCriteria(Criteria criteria, QueryItem item) {
55  
56  		criteria = criteria.add(getCriterion(criteria, item));
57  		return criteria;
58  	}
59  
60  	private static Criterion getCriterion(Criteria criteria, QueryItem item) {
61  		Criterion c;
62  
63  		switch (item.getOp()) {
64  		case LIKE:
65  			c = Restrictions.like(item.getColumn(), item.getValue());
66  			break;
67  		case Eq:
68  			c = Restrictions.eq(item.getColumn(), item.getValue());
69  			break;
70  		case notEq:
71  			c = Restrictions.ne(item.getColumn(), item.getValue());
72  			break;
73  		case isNULL:
74  			c = Restrictions.isNull(item.getColumn());
75  			break;
76  		case notNULL:
77  			c = Restrictions.isNotNull(item.getColumn());
78  			break;
79  		case CUSTOM:
80  			c = Restrictions.sqlRestriction(item.getColumn(), item.getValue(),
81  					Hibernate.DATE);
82  			break;
83  		default:
84  			throw new IllegalArgumentException("Falta un case para el valor "
85  					+ item.getOp());
86  		}
87  		return c;
88  	}
89  
90  }