Skip to content

Commit 96bdc82

Browse files
committed
first project creation.
0 parents  commit 96bdc82

File tree

11 files changed

+1114
-0
lines changed

11 files changed

+1114
-0
lines changed

.gitignore

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
target
2+
.settings
3+
.project
4+
.classpath

pom.xml

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
3+
<modelVersion>4.0.0</modelVersion>
4+
5+
<groupId>org.objectquery</groupId>
6+
<artifactId>hibernateobjectquery</artifactId>
7+
<version>1.0.0-SNAPSHOT</version>
8+
<packaging>jar</packaging>
9+
10+
<name>hibernateobjectquery</name>
11+
<url>http://maven.apache.org</url>
12+
13+
<properties>
14+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
15+
<maven.compiler.source>1.5</maven.compiler.source>
16+
<maven.compiler.target>1.5</maven.compiler.target>
17+
</properties>
18+
19+
<dependencies>
20+
<dependency>
21+
<groupId>junit</groupId>
22+
<artifactId>junit</artifactId>
23+
<version>4.10</version>
24+
<scope>test</scope>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.objectquery</groupId>
28+
<artifactId>objectquery</artifactId>
29+
<version>1.0.0</version>
30+
</dependency>
31+
<dependency>
32+
<groupId>org.hibernate</groupId>
33+
<artifactId>hibernate-core</artifactId>
34+
<version>4.2.0.CR1</version>
35+
</dependency>
36+
<dependency>
37+
<groupId>org.hsqldb</groupId>
38+
<artifactId>hsqldb</artifactId>
39+
<version>2.2.8</version>
40+
<scope>test</scope>
41+
</dependency>
42+
</dependencies>
43+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
1+
package org.objectquery.hibernateobjectquery;
2+
3+
import java.util.ArrayList;
4+
import java.util.Iterator;
5+
import java.util.LinkedHashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import org.objectquery.generic.ConditionElement;
10+
import org.objectquery.generic.ConditionGroup;
11+
import org.objectquery.generic.ConditionItem;
12+
import org.objectquery.generic.ConditionType;
13+
import org.objectquery.generic.GenericInternalQueryBuilder;
14+
import org.objectquery.generic.GenericObjectQuery;
15+
import org.objectquery.generic.Having;
16+
import org.objectquery.generic.Order;
17+
import org.objectquery.generic.PathItem;
18+
import org.objectquery.generic.Projection;
19+
import org.objectquery.generic.ProjectionType;
20+
21+
public class HQLQueryGenerator {
22+
23+
private Map<String, Object> parameters = new LinkedHashMap<String, Object>();
24+
private String query;
25+
26+
HQLQueryGenerator(GenericObjectQuery<?> jpqlObjectQuery) {
27+
buildQuery(jpqlObjectQuery.getTargetClass(), (GenericInternalQueryBuilder) jpqlObjectQuery.getBuilder());
28+
}
29+
30+
private void stringfyGroup(ConditionGroup group, StringBuilder builder) {
31+
if (!group.getConditions().isEmpty()) {
32+
Iterator<ConditionElement> eli = group.getConditions().iterator();
33+
while (eli.hasNext()) {
34+
ConditionElement el = eli.next();
35+
if (el instanceof ConditionItem) {
36+
stringfyCondition((ConditionItem) el, builder);
37+
} else if (el instanceof ConditionGroup) {
38+
builder.append(" ( ");
39+
stringfyGroup((ConditionGroup) el, builder);
40+
builder.append(" ) ");
41+
}
42+
if (eli.hasNext()) {
43+
builder.append(" ").append(group.getType().toString()).append(" ");
44+
}
45+
}
46+
}
47+
}
48+
49+
private String getConditionType(ConditionType type) {
50+
switch (type) {
51+
case CONTAINS:
52+
return " member of ";
53+
case EQUALS:
54+
return " = ";
55+
case IN:
56+
return " in ";
57+
case LIKE:
58+
return " like ";
59+
case MAX:
60+
return " > ";
61+
case MIN:
62+
return " < ";
63+
case MAX_EQUALS:
64+
return " >= ";
65+
case MIN_EQUALS:
66+
return " <= ";
67+
case NOT_CONTAINS:
68+
return " not member of ";
69+
case NOT_EQUALS:
70+
return " <> ";
71+
case NOT_IN:
72+
return " not in ";
73+
case NOT_LIKE:
74+
return "not like";
75+
case LIKE_NOCASE:
76+
return "";
77+
case NOT_LIKE_NOCASE:
78+
return "";
79+
}
80+
return "";
81+
}
82+
83+
private void buildName(PathItem item, StringBuilder sb) {
84+
sb.append("A");
85+
if (item.getParent() != null)
86+
sb.append(".");
87+
GenericInternalQueryBuilder.buildPath(item, sb);
88+
}
89+
90+
private String buildParameterName(PathItem item, Object value) {
91+
StringBuilder name = new StringBuilder();
92+
buildParameterName(item, name);
93+
int i = 1;
94+
String realName = name.toString();
95+
do {
96+
if (!parameters.containsKey(realName)) {
97+
parameters.put(realName, value);
98+
return realName;
99+
}
100+
realName = name.toString() + i++;
101+
} while (true);
102+
}
103+
104+
private void stringfyCondition(ConditionItem cond, StringBuilder sb) {
105+
106+
if (cond.getType().equals(ConditionType.LIKE_NOCASE) || cond.getType().equals(ConditionType.NOT_LIKE_NOCASE)) {
107+
sb.append("UPPER(");
108+
buildName(cond.getItem(), sb);
109+
sb.append(")");
110+
if (cond.getType().equals(ConditionType.NOT_LIKE_NOCASE)) {
111+
sb.append(" not");
112+
}
113+
sb.append(" like UPPER(");
114+
conditionValue(cond, sb);
115+
sb.append(")");
116+
} else if (cond.getType().equals(ConditionType.CONTAINS) || cond.getType().equals(ConditionType.NOT_CONTAINS)) {
117+
conditionValue(cond, sb);
118+
sb.append(" ").append(getConditionType(cond.getType())).append(" ");
119+
buildName(cond.getItem(), sb);
120+
} else {
121+
buildName(cond.getItem(), sb);
122+
sb.append(" ").append(getConditionType(cond.getType())).append(" ");
123+
if (cond.getType().equals(ConditionType.IN) || cond.getType().equals(ConditionType.NOT_IN))
124+
sb.append("(");
125+
conditionValue(cond, sb);
126+
if (cond.getType().equals(ConditionType.IN) || cond.getType().equals(ConditionType.NOT_IN))
127+
sb.append(")");
128+
}
129+
}
130+
131+
private void conditionValue(ConditionItem cond, StringBuilder sb) {
132+
if (cond.getValue() instanceof PathItem) {
133+
buildName((PathItem) cond.getValue(), sb);
134+
} else {
135+
sb.append(":");
136+
sb.append(buildParameterName(cond.getItem(), cond.getValue()));
137+
}
138+
}
139+
140+
private String resolveFunction(ProjectionType projectionType) {
141+
switch (projectionType) {
142+
case AVG:
143+
return "AVG";
144+
case MAX:
145+
return "MAX";
146+
case MIN:
147+
return "MIN";
148+
case COUNT:
149+
return "COUNT";
150+
case SUM:
151+
return "SUM";
152+
}
153+
return "";
154+
}
155+
156+
public void buildQuery(Class<?> clazz, GenericInternalQueryBuilder query) {
157+
parameters.clear();
158+
List<Projection> groupby = new ArrayList<Projection>();
159+
boolean grouped = false;
160+
StringBuilder builder = new StringBuilder();
161+
builder.append("select ");
162+
if (!query.getProjections().isEmpty()) {
163+
Iterator<Projection> projections = query.getProjections().iterator();
164+
while (projections.hasNext()) {
165+
Projection proj = projections.next();
166+
if (proj.getType() != null) {
167+
builder.append(" ").append(resolveFunction(proj.getType())).append("(");
168+
grouped = true;
169+
} else
170+
groupby.add(proj);
171+
buildName(proj.getItem(), builder);
172+
if (proj.getType() != null)
173+
builder.append(")");
174+
if (projections.hasNext())
175+
builder.append(",");
176+
}
177+
} else
178+
builder.append("A");
179+
builder.append(" from ").append(clazz.getName()).append(" A");
180+
if (!query.getConditions().isEmpty()) {
181+
builder.append(" where ");
182+
stringfyGroup(query, builder);
183+
}
184+
boolean orderGrouped = false;
185+
for (Order ord : query.getOrders()) {
186+
if (ord.getProjectionType() != null) {
187+
orderGrouped = true;
188+
break;
189+
}
190+
}
191+
192+
if ((orderGrouped || grouped) && !groupby.isEmpty()) {
193+
builder.append(" group by ");
194+
Iterator<Projection> projections = groupby.iterator();
195+
while (projections.hasNext()) {
196+
Projection proj = projections.next();
197+
buildName(proj.getItem(), builder);
198+
if (projections.hasNext())
199+
builder.append(",");
200+
}
201+
} else if (orderGrouped && query.getProjections().isEmpty()) {
202+
builder.append(" group by A ");
203+
}
204+
205+
if (!query.getHavings().isEmpty()) {
206+
builder.append(" having");
207+
Iterator<Having> havings = query.getHavings().iterator();
208+
while (havings.hasNext()) {
209+
Having having = havings.next();
210+
builder.append(" ").append(resolveFunction(having.getProjectionType())).append('(');
211+
buildName(having.getItem(), builder);
212+
builder.append(')').append(getConditionType(having.getConditionType()));
213+
builder.append(":");
214+
builder.append(buildParameterName(having.getItem(), having.getValue()));
215+
if (havings.hasNext())
216+
builder.append(" AND");
217+
218+
}
219+
}
220+
221+
if (!query.getOrders().isEmpty()) {
222+
builder.append(" order by ");
223+
Iterator<Order> orders = query.getOrders().iterator();
224+
while (orders.hasNext()) {
225+
Order ord = orders.next();
226+
if (ord.getProjectionType() != null)
227+
builder.append(" ").append(resolveFunction(ord.getProjectionType())).append("(");
228+
buildName(ord.getItem(), builder);
229+
if (ord.getProjectionType() != null)
230+
builder.append(")");
231+
if (ord.getType() != null)
232+
builder.append(" ").append(ord.getType());
233+
if (orders.hasNext())
234+
builder.append(',');
235+
}
236+
}
237+
238+
this.query = builder.toString();
239+
}
240+
241+
private void buildParameterName(PathItem conditionItem, StringBuilder builder) {
242+
GenericInternalQueryBuilder.buildPath(conditionItem, builder, "_");
243+
}
244+
245+
public Map<String, Object> getParameters() {
246+
return parameters;
247+
}
248+
249+
public String getQuery() {
250+
return query;
251+
}
252+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package org.objectquery.hibernateobjectquery;
2+
3+
import java.util.ArrayList;
4+
import java.util.Collection;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
import org.hibernate.Query;
9+
import org.hibernate.Session;
10+
import org.objectquery.ObjectQuery;
11+
import org.objectquery.generic.GenericObjectQuery;
12+
import org.objectquery.generic.ObjectQueryException;
13+
14+
public class HibernateObjectQuery {
15+
16+
public static HQLQueryGenerator hqlGenerator(ObjectQuery<?> objectQuery) {
17+
if (objectQuery instanceof GenericObjectQuery<?>)
18+
return new HQLQueryGenerator((GenericObjectQuery<?>) objectQuery);
19+
throw new ObjectQueryException("The Object query instance of unconvertable implementation ", null);
20+
}
21+
22+
public static Query buildQuery(ObjectQuery<?> objectQuery, Session session) {
23+
HQLQueryGenerator gen = hqlGenerator(objectQuery);
24+
Query qu = session.createQuery(gen.getQuery());
25+
Map<String, Object> pars = gen.getParameters();
26+
for (Map.Entry<String, Object> ent : pars.entrySet()) {
27+
if (ent.getValue() instanceof Collection<?>) {
28+
if (ent.getValue() instanceof List<?>)
29+
qu.setParameterList(ent.getKey(), (List<?>) ent.getValue());
30+
else
31+
qu.setParameterList(ent.getKey(), new ArrayList<Object>((Collection<?>) ent.getValue()));
32+
} else
33+
qu.setParameter(ent.getKey(), ent.getValue());
34+
}
35+
return qu;
36+
}
37+
38+
public static Object execute(ObjectQuery<?> objectQuery, Session session) {
39+
return buildQuery(objectQuery, session).list();
40+
}
41+
42+
}

0 commit comments

Comments
 (0)