package com.norteksoft.product.web.struts2.query;
import java.util.ArrayList;
import java.util.Iterator;
/**
* private QueryBean getQuery(HttpServletRequest request, String sortQuery) {
QueryGenerator queryGenerator = new QueryGenerator("from Person p ");
// 如果构造函数中传入的字符串中有where则不需要调用了
queryGenerator.where();
// 调用一次and后对后面的字段都生效,说明这些字段都是以and连接
// 如果想改变则调用or()方法或者resetLogic()方法
// 如果之前没有调用where(),则必须在添加一个比较条件后才能调用and()或者or()
queryGenerator.and();
// 会根据value是否为空自动判断是否在查询语句中添加这个条件
// 不需要再写类似于value != null && "".equals(value)这样的代码以及字符串拼接
queryGenerator.eq("p.belongDep.id", FieldType.LONG, request.getParameter("departmentId"));
queryGenerator.like("p.name", request.getParameter("name"), MatchMode.ANYWHERE);
queryGenerator.eq("p.sex", FieldType.STRING, request.getParameter("sex"));
// FieldType.SQLDATE用于model的属性类型是java.sql.Date,FieldType.UTILDATE用于java.util.Date
queryGenerator.ge("p.birthday", FieldType.UTILDATE, request.getParameter("birthdayStart"));
queryGenerator.le("p.birthday", FieldType.UTILDATE, request.getParameter("birthdayStart"));
这段代码演示了如何使用子查询就是添加括号
QueryGenerator subQuery = new QueryGenerator();
//闭包的调用方式 使代码更简洁
//p.a,p.b都是示意用的字段名
subQuery.eq("p.a", FieldType.INTEGER, "1")
.or()
.le("p.b", FieldType.FLOAT, "1.2");
queryGenerator.subQueryGenerator(subQuery);
queryGenerator.le("p.c", FieldType.DOUBLE, "5.0");
// 追加order by语句
queryGenerator.append(addTableAlias2OrderBy(sortQuery, "p"));
return new QueryBean(queryGenerator.getQuery(), queryGenerator.getParametersAsArray());
}
* @author huhongchun
*
*/
@SuppressWarnings({ "unchecked" })
public class QueryGenerator {
private StringBuffer preparedQuery = new StringBuffer(); // 预处理的hql查询条件
private StringBuffer orderBy = new StringBuffer(); // 排序条件
private ArrayList parameters = new ArrayList(); // 属性值集合
private boolean additionalCondition = true; // 是否需要增加其他查询条件,默认增加
private String logicOperation=null;
private String logic_or = " or "; // 保留前后的空格,注意字符长度的处理
private String logic_and = " and ";
private String eq = "=";
private String ge = ">=";
private String gt = ">";
private String le = "<=";
private String lt = "<";
private String ne = "<>";
private String space = " ";
private String comma = ",";
private String interrogation = " ? ";
private String space_bracket = " (";
private String bracket_space = ") ";
private String order_by = " order by ";
public QueryGenerator() {
}
public QueryGenerator(String initalHql) {
// TODO Auto-generated constructor stub
preparedQuery.append(initalHql);
}
/**
* 等于条件("=")
*
* @param fieldName
* String
* @param type
* String
* @param value
* String
* @return QueryGenerator
*/
public QueryGenerator eq(String fieldName, String type, String value) {
return compareHelp(fieldName, type, eq, value);
}
/**
* 大于等于条件(">=")
*
* @param fieldName
* String
* @param type
* String
* @param value
* String
* @return QueryGenerator
*/
public QueryGenerator ge(String fieldName, String type, String value) {
return compareHelp(fieldName, type, ge, value);
}
/**
* 大于条件(">")
*
* @param fieldName
* String
* @param type
* String
* @param value
* String
* @return QueryGenerator
*/
public QueryGenerator gt(String fieldName, String type, String value) {
return compareHelp(fieldName, type, gt, value);
}
/**
* 小于等于条件("<=")
*
* @param fieldName
* String
* @param type
* String
* @param value
* String
* @return QueryGenerator
*/
public QueryGenerator le(String fieldName, String type, String value) {
return compareHelp(fieldName, type, le, value);
}
/**
* 小于条件("<")
*
* @param fieldName
* String
* @param type
* String
* @param value
* String
* @return QueryGenerator
*/
public QueryGenerator lt(String fieldName, String type, String value) {
return compareHelp(fieldName, type, lt, value);
}
/**
* 不等于条件("<>")
*
* @param fieldName
* String
* @param type
* String
* @param value
* String
* @return QueryGenerator
*/
public QueryGenerator ne(String fieldName, String type, String value) {
return compareHelp(fieldName, type, ne, value);
}
/**
* 比较运算查询条件
*
* @param fieldName
* String
* @param type
* String
* @param compare
* String
* @param value
* String
* @return QueryGenerator
*/
private QueryGenerator compareHelp(String fieldName, String type, String compare,
String value) {
if (additionalCondition && fieldName != null && value != null
&& type != null && compare != null && !"".equals(fieldName)
&& !"".equals(value) && !"".equals(type) && !"".equals(compare)) {
//根据操作标志来决定是否添加and或者or来分割不同的条件
logicHelp(logicOperation);
preparedQuery.append(fieldName).append(compare).append(
interrogation);
preparedQuery.append(space);
this.parameters.add(QueryUtil.getObjectByRealType(type, value));
//this.arrangeProps(fieldName, type, HelpUtil.filter(value));
}
return this;
}
/**
* 空值条件
*
* @param fieldName
* String
* @return QueryGenerator
*/
public QueryGenerator isNull(String fieldName) {
return nullHelp(fieldName, true);
}
/**
* 非空值条件
*
* @param fieldName
* String
* @return QueryGenerator
*/
public QueryGenerator isNotNull(String fieldName) {
return nullHelp(fieldName, false);
}
/**
* 空值查询条件
*
* @param fieldName
* String
* @param isNull
* boolean
* @return
*/
private QueryGenerator nullHelp(String fieldName, boolean isNull) {
if (additionalCondition && fieldName != null && !"".equals(fieldName)) {
// 根据操作标志来决定是否添加and或者or来分割不同的条件
logicHelp(logicOperation);
preparedQuery.append(fieldName);
if (isNull) {
preparedQuery.append(" is null ");
} else {
preparedQuery.append(" is not null ");
}
}
return this;
}
/**
* 范围条件("between ? and ?")
*
* @param fieldName
* String
* @param type
* String
* @param lo
* String
* @param hi
* String
* @return QueryGenerator
*/
public QueryGenerator between(String fieldName, String type, String lo, String hi) {
return betweenHelp(fieldName, type, false, lo, hi);
}
/**
* 范围条件("not between ? and ?")
*
* @param fieldName
* String
* @param type
* String
* @param lo
* String
* @param hi
* String
* @return QueryGenerator
*/
public QueryGenerator notBetween(String fieldName, String type, String lo, String hi) {
return betweenHelp(fieldName, type, true, lo, hi);
}
/**
* 范围查询条件between和not between
*
* @param fieldName
* String
* @param type
* String
* @param isNot
* boolean
* @param lo
* String
* @param hi
* String
* @return QueryGenerator
*/
private QueryGenerator betweenHelp(String fieldName, String type, boolean isNot,
String lo, String hi) {
if (additionalCondition && fieldName != null && type != null
&& lo != null && hi != null && !"".equals(fieldName)
&& !"".equals(type) && !"".equals(lo) && !"".equals(hi)) {
// 根据操作标志来决定是否添加and或者or来分割不同的条件
logicHelp(logicOperation);
String keyWord = ""; // between的类型
if (isNot) {
keyWord = " not between ";
} else {
keyWord = " between ";
}
preparedQuery.append(fieldName).append(space).append(keyWord)
.append(interrogation).append(logic_and).append(
interrogation).append(space);
this.parameters.add(QueryUtil.getObjectByRealType(type, lo));
this.parameters.add(QueryUtil.getObjectByRealType(type, hi));
//this.arrangeProps(fieldName, type, lo);
//this.arrangeProps(fieldName, type, hi);
}
return this;
}
/**
* 模糊查询条件("like")
*
* @param fieldName
* String
* @param value
* String
* @param matchMode
* MatchMode
* @return QueryGenerator
*/
public QueryGenerator like(String fieldName, String value, MatchMode matchMode) {
return likeHelp(fieldName, value, matchMode);
}
/**
* 模糊查询条件like
*
* @param fieldName
* String
* @param value
* String
* @param matchMode
* MatchMode
* @return
*/
private QueryGenerator likeHelp(String fieldName, String value, MatchMode matchMode) {
if (additionalCondition && fieldName != null && value != null
&& !"".equals(fieldName) && !"".equals(value)) {
// 根据操作标志来决定是否添加and或者or来分割不同的条件
logicHelp(logicOperation);
preparedQuery.append(fieldName);
preparedQuery.append(space);
preparedQuery.append("like");
preparedQuery.append(interrogation);
this.parameters.add(matchMode.toMatchString(value));
//this.arrangeProps(fieldName, "string", HelpUtil.filter(matchMode
// .toMatchString(value)));
}
return this;
}
/**
* 范围查询条件("in(?,?,?,...,?)")
*
* @param fieldName
* String
* @param type
* String
* @param obj
* Object
* @return QueryGenerator
*/
public QueryGenerator in(String fieldName, String type, Object obj) {
return inHelp(fieldName, type, true, obj);
}
/**
* 范围查询条件("not in(?,?,?,...,?)")
*
* @param fieldName
* String
* @param obj
* Object
* @param type
* String
* @return QueryGenerator
*/
public QueryGenerator notIn(String fieldName, Object obj, String type) {
return inHelp(fieldName, type, false, obj);
}
/**
* 范围查询条件in
*
* @param fieldName
* String
* @param type
* String
* @param in
* boolean
* @param obj
* Object
* @return QueryGenerator
*/
private QueryGenerator inHelp(String fieldName, String type, boolean in, Object obj) {
if (additionalCondition && fieldName != null && type != null
&& !"".equals(fieldName) && !"".equals(type) && obj != null) {
// 根据操作标志来决定是否添加and或者or来分割不同的条件
logicHelp(logicOperation);
String keyWord = "";
if (in) {
keyWord = " in ";
} else {
keyWord = " not in ";
}
preparedQuery.append(fieldName);
preparedQuery.append(keyWord);
preparedQuery.append(space_bracket);
preparedQuery.append(StringUtil.formInPrepared(obj));
preparedQuery.append(bracket_space);
Iterator it = QueryUtil.obj2Iterator(obj);
while (it.hasNext()) {
this.parameters.add(QueryUtil.getObjectByRealType(type, (String) it.next()));
//this.arrangeProps(fieldName, type, HelpUtil.filter((String) it
//.next()));
}
}
return this;
}
/**
* in ? or not in ? 不形成in (?,?....?)的形式
*/
// private void inHelp(String fieldName, String type, boolean in, Object[] obj) {
// if (additionalCondition && fieldName != null && type != null
// && !"".equals(fieldName) && !"".equals(type) && obj != null) {
// String keyWord = "";
// if (in) {
// keyWord = " in ";
// } else {
// keyWord = " not in ";
// }
// preparedQuery.append(fieldName);
// preparedQuery.append(keyWord);
// preparedQuery.append(interrogation);
//
// this.parameters.add(obj);
// //arrangeProps(fieldName, type, obj);
// }
// }
/**
* 记录将要增加and条件,但是否真正添加得看后面的条件字段是否正确
*
* @param filter
* PreparedFilter
* @return PreparedFilter
*/
public QueryGenerator and() {
logicOperation=logic_and;
return this;
//return logicHelp(logic_and);
}
/**
* 记录将要增加or条件,但是否真正添加得看后面的条件字段是否正确
*
* @param queryGenerator
* QueryGenerator
* @return QueryGenerator
*/
public QueryGenerator or() {
logicOperation=logic_or;
return this;
}
/**
* 增加逻辑条件
*
* @param logic
* String
* @param queryGenerator
* QueryGenerator
* @return QueryGenerator
*/
private QueryGenerator logicHelp(String logic) {
if (additionalCondition && logicOperation!=null) {
preparedQuery.append(logic);
}
return this;
}
/**
* 清空逻辑操作标志 查询语句中的字段之间不会自动添加and或or关键字了
* @return
*/
public QueryGenerator resetLogic(){
logicOperation=null;
return this;
}
/**
* 添加where关键字
* @return
*/
public QueryGenerator where() {
// if not exists where clause
if (!StringUtil.findString(preparedQuery.toString(), "where", true)) {
preparedQuery.append(" where 1=1 ");
} else {
preparedQuery.append(" and 1=1 ");
}
return this;
}
/**
* 增加子条件,相当于插入条件" and (查询条件)", 也就是增加优先级
*
* @param queryGenerator
* SqlqueryGenerator
* @return QueryGenerator
*/
public QueryGenerator subQueryGenerator(QueryGenerator queryGenerator) {
if (additionalCondition && queryGenerator != null
&& !"".equals(queryGenerator.getQuery())) {
// 根据操作标志来决定是否添加and或者or来分割不同的条件
logicHelp(logicOperation);
preparedQuery.append(space_bracket);
preparedQuery.append(queryGenerator.getQuery());
preparedQuery.append(bracket_space);
this.copyParameters(queryGenerator); // 复制子查询的参数到主查询
}
return this;
}
private void copyParameters(QueryGenerator queryGenerator) {
// TODO Auto-generated method stub
Iterator it=queryGenerator.getParameters().iterator();
while(it.hasNext()){
this.parameters.add(it.next());
}
}
/**
* 增加排序条件(order by)
*
* @param fieldName
* String
*/
public void orderBy(String fieldName) {
if (orderBy.length() > 0) {
orderBy.append(comma);
}
orderBy.append(fieldName);
}
/**
* 获取排序条件
*
* @return String
*/
public String getOrderByStr() {
return orderBy.toString();
}
/**
* 查询条件
*
* @return String
*/
public String getQuery() {
return preparedQuery.toString();
}
/**
* 排序条件
*
* @return String
*/
public String getOrderByWithKey() {
return order_by + orderBy.toString();
}
public Object[] getParametersAsArray() {
return parameters.toArray();
}
/**
* 对象属性值
*
* @return ArrayList
*/
public ArrayList getParameters() {
return parameters;
}
/**
* 设置初始查询条件
*
* @param condition
* String
*/
public void setInitalQuery(String condition) {
preparedQuery.append(condition);
}
/**
* 设置排序条件
*
* @param str
* String
*/
public void setOrderByStr(String str) {
orderBy = new StringBuffer(str);
}
/**
* 设置属性值集合
*
* @param parameters
* ArrayList
*/
public void setParameters(ArrayList parameters) {
this.parameters = parameters;
}
public boolean isAdditionalCondition() {
return additionalCondition;
}
public void setAdditionalCondition(boolean additionalCondition) {
this.additionalCondition = additionalCondition;
}
/**
* 将过滤器中的查询条件添加到给定的SQL语句
*
* @param sql
* String
* @return String
*/
public String concatQueryGenerator(String sql) {
StringBuffer sqlBf = new StringBuffer();
sqlBf.append(sql);
if (!StringUtil.findString(sql, "where", true)) { // if not exists
// where clause
sqlBf.append(" where 1=1 ");
}
if (!"".equals(this.getQuery())) {
sqlBf.append(this.getQuery()); // add query condition
}
if (!"".equals(this.getOrderByStr())) {
sqlBf.append(this.getOrderByWithKey()); // add order by clause
}
return sqlBf.toString();
}
/**
* 在已有查询语句的结尾追加查询语句
* @param query
* @return
*/
public QueryGenerator append(String query){
this.preparedQuery.append(query);
return this;
}
}