com.base4j.mybatis.base.QueryParams Maven / Gradle / Ivy
The newest version!
package com.base4j.mybatis.base;
import com.base4j.mybatis.sql.entity.EntityColumn;
import com.base4j.mybatis.sql.entity.EntityTable;
import com.base4j.mybatis.sql.helper.EntityHelper;
import com.base4j.mybatis.tool.NullUtil;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.apache.ibatis.type.TypeHandler;
import java.util.*;
/**
* 复杂查询条件封装
* Created by USER on 2017-03-17.
*/
public class QueryParams {
protected String orderByClause;
protected boolean distinct;
protected boolean exists;
protected boolean notNull;
protected Set selectColumns;
protected List orCriteria;
protected Class> entityClass;
protected EntityTable table;
//属性和列对应
protected Map propertyMap;
//动态表名
protected String tableName;
protected OrderBy ORDERBY;
/**
* 默认exists为true
*
* @param entityClass
*/
public QueryParams(Class> entityClass) {
this(entityClass, true);
}
/**
* 带exists参数的构造方法,默认notNull为false,允许为空
*
* @param entityClass
* @param exists - true时,如果字段不存在就抛出异常,false时,如果不存在就不使用该字段的条件
*/
public QueryParams(Class> entityClass, boolean exists) {
this(entityClass, exists, false);
}
/**
* 带exists参数的构造方法
*
* @param entityClass
* @param exists - true时,如果字段不存在就抛出异常,false时,如果不存在就不使用该字段的条件
* @param notNull - true时,如果值为空,就会抛出异常,false时,如果为空就不使用该字段的条件
*/
public QueryParams(Class> entityClass, boolean exists, boolean notNull) {
this.exists = exists;
this.notNull = notNull;
orCriteria = new ArrayList();
this.entityClass = entityClass;
table = EntityHelper.getEntityTableByEntityClass(entityClass);
propertyMap = table.getPropertyMap();
this.ORDERBY = new OrderBy(this, propertyMap);
}
public Class> getEntityClass() {
return entityClass;
}
public String getOrderByClause() {
return orderByClause;
}
// public void setOrderByClause(String orderByClause) {
// this.orderByClause = orderByClause;
// }
public OrderBy orderBy(String property) {
this.ORDERBY.orderBy(property);
return this.ORDERBY;
}
public static class OrderBy {
private QueryParams Params;
private Boolean isProperty;
//属性和列对应
protected Map propertyMap;
protected boolean notNull;
public OrderBy(QueryParams Params, Map propertyMap) {
this.Params = Params;
this.propertyMap = propertyMap;
}
private String property(String property) {
if (propertyMap.containsKey(property)) {
return propertyMap.get(property).getColumn();
} else if (notNull) {
throw new RuntimeException("当前实体类不包含名为" + property + "的属性!");
} else {
return null;
}
}
public OrderBy orderCondition(String commond) {
if ("asc".equalsIgnoreCase(commond)) {
return this.asc();
} else if ("desc".equalsIgnoreCase(commond)) {
return this.desc();
} else {
throw new IllegalArgumentException("排序参数只能是:desc或asc");
}
}
public OrderBy orderBy(String property) {
String column = property(property);
if (column == null) {
isProperty = false;
return this;
}
if (NullUtil.isNotEmpty(Params.getOrderByClause())) {
// Params.setOrderByClause(Params.getOrderByClause() + "," + column);
Params.orderByClause = Params.getOrderByClause() + ", " + Params.table.getName() + "." + column;
} else {
// Params.setOrderByClause(column);
Params.orderByClause = Params.table.getName() + "." + column;
}
isProperty = true;
return this;
}
public OrderBy desc() {
if (isProperty) {
Params.orderByClause = Params.getOrderByClause() + " DESC";
isProperty = false;
}
return this;
}
public OrderBy asc() {
if (isProperty) {
Params.orderByClause = Params.getOrderByClause() + " ASC";
isProperty = false;
}
return this;
}
}
public Set getSelectColumns() {
return selectColumns;
}
/**
* 指定要查询的属性列 - 这里会自动映射到表字段
* 如果不指定查询列,则查询所有列
*
* @param properties
* @return
*/
public QueryParams selectProperties(String... properties) {
if (properties != null && properties.length > 0) {
if (this.selectColumns == null) {
this.selectColumns = new LinkedHashSet();
}
for (String property : properties) {
if (propertyMap.containsKey(property)) {
this.selectColumns.add(propertyMap.get(property).getColumn());
}
}
}
return this;
}
// private boolean isDistinct() {
// return distinct;
// }
//
// private void setDistinct(boolean distinct) {
// this.distinct = distinct;
// }
public List getOrCriteria() {
return orCriteria;
}
public void or(Criteria criteria) {
orCriteria.add(criteria);
}
public Criteria or() {
Criteria criteria = createCriteriaInternal();
orCriteria.add(criteria);
return criteria;
}
public Criteria createCriteria() {
Criteria criteria = createCriteriaInternal();
if (orCriteria.size() == 0) {
orCriteria.add(criteria);
}
return criteria;
}
protected Criteria createCriteriaInternal() {
Criteria criteria = new Criteria(propertyMap, exists, notNull);
return criteria;
}
public void clear() {
orCriteria.clear();
orderByClause = null;
distinct = false;
}
// /**
// * 设置表名
// *
// * @param tableName
// */
// public void setTableName(String tableName) {
// this.tableName = tableName;
// }
// public String getDynamicTableName() {
// return tableName;
// }
protected abstract static class GeneratedCriteria {
protected List criteria;
//字段是否必须存在
protected boolean exists;
//值是否不能为空
protected boolean notNull;
//属性和列对应
protected Map propertyMap;
protected GeneratedCriteria(Map propertyMap, boolean exists, boolean notNull) {
super();
this.exists = exists;
this.notNull = notNull;
criteria = new ArrayList();
this.propertyMap = propertyMap;
}
private String column(String property) {
if (propertyMap.containsKey(property)) {
return propertyMap.get(property).getColumn();
} else if (exists) {
throw new RuntimeException("当前实体类不包含名为" + property + "的属性!");
} else {
return null;
}
}
private String property(String property) {
if (propertyMap.containsKey(property)) {
return property;
} else if (exists) {
throw new RuntimeException("当前实体类不包含名为" + property + "的属性!");
} else {
return null;
}
}
public boolean isValid() {
return criteria.size() > 0;
}
public List getAllCriteria() {
return criteria;
}
public List getCriteria() {
return criteria;
}
protected void addCriterion(String condition) {
if (condition == null) {
throw new RuntimeException("Value for condition cannot be null");
}
if (condition.startsWith("null")) {
return;
}
criteria.add(new Criterion(condition));
}
protected void addCriterion(String condition, Object value, String property) {
if (value == null) {
if (notNull) {
throw new RuntimeException("Value for " + property + " cannot be null");
} else {
return;
}
}
if (property == null) {
return;
}
criteria.add(new Criterion(condition, value));
}
protected void addCriterion(String condition, Object value1, Object value2, String property) {
if (value1 == null || value2 == null) {
if (notNull) {
throw new RuntimeException("Between values for " + property + " cannot be null");
} else {
return;
}
}
if (property == null) {
return;
}
criteria.add(new Criterion(condition, value1, value2));
}
public Criteria andIsNull(String property) {
addCriterion(column(property) + " is null");
return (Criteria) this;
}
public Criteria andIsNotNull(String property) {
addCriterion(column(property) + " is not null");
return (Criteria) this;
}
public Criteria andEqualTo(String property, Object value) {
addCriterion(column(property) + " =", value, property(property));
return (Criteria) this;
}
public Criteria andNotEqualTo(String property, Object value) {
addCriterion(column(property) + " <>", value, property(property));
return (Criteria) this;
}
public Criteria andGreaterThan(String property, Object value) {
addCriterion(column(property) + " >", value, property(property));
return (Criteria) this;
}
public Criteria andGreaterThanOrEqualTo(String property, Object value) {
addCriterion(column(property) + " >=", value, property(property));
return (Criteria) this;
}
public Criteria andLessThan(String property, Object value) {
addCriterion(column(property) + " <", value, property(property));
return (Criteria) this;
}
public Criteria andLessThanOrEqualTo(String property, Object value) {
addCriterion(column(property) + " <=", value, property(property));
return (Criteria) this;
}
public Criteria andIn(String property, Iterable values) {
addCriterion(column(property) + " in", values, property(property));
return (Criteria) this;
}
public Criteria andNotIn(String property, Iterable values) {
addCriterion(column(property) + " not in", values, property(property));
return (Criteria) this;
}
public Criteria andBetween(String property, Object value1, Object value2) {
addCriterion(column(property) + " between", value1, value2, property(property));
return (Criteria) this;
}
public Criteria andNotBetween(String property, Object value1, Object value2) {
addCriterion(column(property) + " not between", value1, value2, property(property));
return (Criteria) this;
}
public Criteria andLike(String property, String value) {
addCriterion(column(property) + " like", value, property(property));
return (Criteria) this;
}
public Criteria andNotLike(String property, String value) {
addCriterion(column(property) + " not like", value, property(property));
return (Criteria) this;
}
/**
* 手写条件
*
* @param condition 例如 "length(countryname)<5"
* @return
*/
public Criteria andCondition(String condition) {
addCriterion(condition);
return (Criteria) this;
}
/**
* 手写左边条件,右边用value值
*
* @param condition 例如 "length(countryname)="
* @param value 例如 5
* @return
*/
public Criteria andCondition(String condition, Object value) {
criteria.add(new Criterion(condition, value));
return (Criteria) this;
}
/**
* 手写左边条件,右边用value值
*
* @param condition 例如 "length(countryname)="
* @param value 例如 5
* @param typeHandler 类型处理
* @return
*/
@Deprecated
public Criteria andCondition(String condition, Object value, String typeHandler) {
criteria.add(new Criterion(condition, value, typeHandler));
return (Criteria) this;
}
/**
* 手写左边条件,右边用value值
*
* @param condition 例如 "length(countryname)="
* @param value 例如 5
* @param typeHandler 类型处理
* @return
*/
@Deprecated
public Criteria andCondition(String condition, Object value, Class extends TypeHandler> typeHandler) {
criteria.add(new Criterion(condition, value, typeHandler.getCanonicalName()));
return (Criteria) this;
}
/**
* 将此对象的不为空的字段参数作为相等查询条件
*
* @param param 参数对象
*/
public Criteria andEqualTo(Object param) {
MetaObject metaObject = SystemMetaObject.forObject(param);
String[] properties = metaObject.getGetterNames();
for (String property : properties) {
//属性和列对应Map中有此属性
if (propertyMap.get(property) != null) {
Object value = metaObject.getValue(property);
//属性值不为空
if (value != null) {
andEqualTo(property, value);
}
}
}
return (Criteria) this;
}
}
public static class Criteria extends GeneratedCriteria {
protected Criteria(Map propertyMap, boolean exists, boolean notNull) {
super(propertyMap, exists, notNull);
}
}
public static class Criterion {
private String condition;
private Object value;
private Object secondValue;
private boolean noValue;
private boolean singleValue;
private boolean betweenValue;
private boolean listValue;
private String typeHandler;
protected Criterion(String condition) {
super();
this.condition = condition;
this.typeHandler = null;
this.noValue = true;
}
protected Criterion(String condition, Object value, String typeHandler) {
super();
this.condition = delCondition(condition);
this.value = value;
this.typeHandler = typeHandler;
if (value instanceof Collection>) {
this.listValue = true;
} else {
this.singleValue = true;
}
}
protected Criterion(String condition, Object value) {
this(condition, value, null);
}
protected Criterion(String condition, Object value, Object secondValue, String typeHandler) {
super();
this.condition = delCondition(condition);
this.value = value;
this.secondValue = secondValue;
this.typeHandler = typeHandler;
this.betweenValue = true;
}
protected Criterion(String condition, Object value, Object secondValue) {
this(condition, value, secondValue, null);
}
private String delCondition(String condition) {
if (condition.contains(".")) {
return condition.substring(condition.indexOf(".") + 1, condition.length());
} else {
return condition;
}
}
public String getCondition() {
return condition;
}
public Object getValue() {
return value;
}
public Object getSecondValue() {
return secondValue;
}
public boolean isNoValue() {
return noValue;
}
public boolean isSingleValue() {
return singleValue;
}
public boolean isBetweenValue() {
return betweenValue;
}
public boolean isListValue() {
return listValue;
}
public String getTypeHandler() {
return typeHandler;
}
}
}