1
2
3
4
5
6
7
8 package org.asyrinx.joey.om.hibernate;
9
10 import java.text.DateFormat;
11 import java.text.ParseException;
12 import java.util.Collection;
13 import java.util.Date;
14 import java.util.Map;
15
16 import net.sf.hibernate.Criteria;
17 import net.sf.hibernate.Session;
18 import net.sf.hibernate.exception.NestableRuntimeException;
19 import net.sf.hibernate.expression.Criterion;
20 import net.sf.hibernate.expression.Expression;
21 import net.sf.hibernate.expression.Order;
22
23 import org.asyrinx.brownie.core.sql.Operator;
24 import org.asyrinx.joey.om.ConditionTranslator;
25 import org.asyrinx.joey.om.SearchCondition;
26
27 /***
28 * @author akima
29 */
30 public class CriteriaTranslator extends AbstractHibernateTranslator implements
31 ConditionTranslator {
32
33 /***
34 *
35 */
36 public CriteriaTranslator(Map columnToProperty, Map tableToClass,
37 Session session, Class targetClass) {
38 super(columnToProperty, tableToClass);
39 this.criteria = session.createCriteria(targetClass);
40 setUsePropertyInCondition(true);
41 }
42
43 private final Criteria criteria;
44
45 /***
46 * @see org.asyrinx.joey.om.ConditionTranslator#addFrom(java.lang.String)
47 */
48 public void addFrom(String tableName) {
49
50 }
51
52 /***
53 * @see org.asyrinx.joey.om.ConditionTranslator#addInt(java.lang.String,
54 * java.lang.String, java.lang.Object)
55 */
56 public void addInt(String fieldName, Object value, Object operator) {
57 fieldName = toFieldName(fieldName);
58 final Object val = toNumber(value, Integer.class);
59 if (val == null)
60 return;
61 criteria.add(CriteriaUtils.toExpression(Operator.get(operator),
62 fieldName, val));
63 }
64
65 /***
66 * @see org.asyrinx.joey.om.ConditionTranslator#addLong(java.lang.String,
67 * java.lang.String, java.lang.Object)
68 */
69 public void addLong(String fieldName, Object value, Object operator) {
70 fieldName = toFieldName(fieldName);
71 final Object val = toNumber(value, Long.class);
72 if (val == null)
73 return;
74 criteria.add(CriteriaUtils.toExpression(Operator.get(operator),
75 fieldName, val));
76 }
77
78 /***
79 * @see org.asyrinx.joey.om.ConditionTranslator#addDate(java.lang.String,
80 * java.lang.String, java.lang.Object, java.text.DateFormat)
81 */
82 public void addDate(String fieldName, Object value, Object operator,
83 DateFormat dateFormat) {
84 fieldName = toFieldName(fieldName);
85 try {
86 final Date d = (value instanceof Date) ? (Date) value : dateFormat
87 .parse(String.valueOf(value));
88 criteria.add(CriteriaUtils.toExpression(Operator.get(operator),
89 fieldName, d));
90 } catch (ParseException e) {
91 throw new NestableRuntimeException(e);
92 }
93 }
94
95 /***
96 * @see org.asyrinx.joey.om.ConditionTranslator#addString(java.lang.String,
97 * java.lang.String, java.lang.Object)
98 */
99 public void addString(String fieldName, Object value, Object operator) {
100 fieldName = toFieldName(fieldName);
101 criteria.add(CriteriaUtils.toExpression(Operator.get(operator),
102 fieldName, value));
103 }
104
105 /***
106 * @see org.asyrinx.joey.om.ConditionTranslator#addAscendingOrderByColumn(java.lang.String)
107 */
108 public void addAscendingOrderByColumn(String fieldName) {
109 fieldName = toFieldName(fieldName);
110 criteria.addOrder(Order.asc(fieldName));
111 }
112
113 /***
114 * @see org.asyrinx.joey.om.ConditionTranslator#addDescendingOrderByColumn(java.lang.String)
115 */
116 public void addDescendingOrderByColumn(String fieldName) {
117 fieldName = toFieldName(fieldName);
118 criteria.addOrder(Order.desc(fieldName));
119 }
120
121 /***
122 * @return
123 */
124 public Criteria toCriteria(SearchCondition condition) {
125 condition.attach(this);
126 return criteria;
127 }
128
129 }
130
131 class CriteriaUtils {
132 public static Criterion toExpression(Operator operator, Object targetValue,
133 Object value) {
134 if (operator == null) {
135 throw new UnsupportedOperationException(
136 "No operator to translate to Expression");
137 } else if (operator == Operator.AND) {
138 if (targetValue instanceof Criterion && value instanceof Criterion)
139 return Expression.and((Criterion) targetValue,
140 (Criterion) value);
141 else
142 throw new UnsupportedOperationException(
143 "target and value must be Criteria.");
144 } else if (operator == Operator.EQUAL || operator == Operator.EQUAL2) {
145 return Expression.eq(toString(targetValue), value);
146 } else if (operator == Operator.IN) {
147 if (value instanceof Collection)
148 return Expression.in(toString(targetValue), (Collection) value);
149 else if (value.getClass().isArray()) {
150 if (!value.getClass().getComponentType().isPrimitive())
151 return Expression.in(toString(targetValue),
152 (Object[]) value);
153 throw new UnsupportedOperationException(
154 "value must be Collection or array of Object.");
155 } else
156 throw new UnsupportedOperationException(
157 "value must be Collection or array of Object.");
158 } else if (operator == Operator.GREATER_EQUAL
159 || operator == Operator.GREATER_EQUAL2) {
160 return Expression.ge(toString(targetValue), value);
161 } else if (operator == Operator.GREATER_THAN) {
162 return Expression.gt(toString(targetValue), value);
163 } else if (operator == Operator.LIKE) {
164 return Expression.like(toString(targetValue), value);
165 } else if (operator == Operator.NOT_EQUAL
166 || operator == Operator.NOT_EQUAL2) {
167 return Expression.not(toExpression(Operator.EQUAL,
168 toString(targetValue), value));
169 } else if (operator == Operator.NOT_IN) {
170 return Expression.not(toExpression(Operator.IN,
171 toString(targetValue), value));
172 } else if (operator == Operator.OR) {
173 if (targetValue instanceof Criterion && value instanceof Criterion)
174 return Expression
175 .or((Criterion) targetValue, (Criterion) value);
176 else
177 throw new UnsupportedOperationException(
178 "target and value must be Criteria.");
179 } else if (operator == Operator.LESS_EQUAL
180 || operator == Operator.LESS_EQUAL2) {
181 return Expression.le(toString(targetValue), value);
182 } else if (operator == Operator.LESS_THAN) {
183 return Expression.lt(toString(targetValue), value);
184 } else {
185 throw new UnsupportedOperationException(
186 "Unknown operator to translate to Expression. '"
187 + operator.toString() + "'");
188 }
189 }
190
191 private static String toString(Object targetValue) {
192 if (!(targetValue instanceof String))
193 throw new UnsupportedOperationException("target must be String.");
194 return (String) targetValue;
195 }
196
197 }