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