/** * Copyright 2014 Duan Bingnan * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.pinus4j.api.query.impl; import java.lang.reflect.Array; import java.util.List; import java.util.Set; import org.pinus4j.api.SQL; import org.pinus4j.api.query.impl.DefaultQueryImpl.ConditionRelation; import org.pinus4j.datalayer.SQLBuilder; import org.pinus4j.utils.BeansUtil; import org.pinus4j.utils.StringUtil; import com.google.common.collect.Lists; /** * 查询条件. * * @author duanbn */ public class Condition { /** * 条件字段. */ private String field; /** * 条件值. */ private Object value; /** * 条件枚举. */ private QueryOpt opt; /** * 保存or查询条件. */ private Condition[] orCond; /** * 保存and查询条件. */ private Condition[] andCond; /** * 在一个Query中的条件 */ private ConditionRelation conditionRelation; /** * 构造方法. 防止调用者直接创建此对象. */ private Condition() { } /** * 构造方法. * * @param field 条件字段 * @param value 条件值 * @param opt 条件枚举 */ private Condition(String field, Object value, QueryOpt opt, Class<?> clazz) { if (StringUtil.isBlank(field)) { throw new IllegalArgumentException("条件字段不能为空, condition field=" + field); } if (value == null) { throw new IllegalArgumentException("参数错误, condition value=" + value); } if (value.getClass().isArray() && Array.getLength(value) == 0) { throw new IllegalArgumentException("参数错误, condition value是数组并且数组长度为0"); } this.field = field; if (clazz != null) this.field = BeansUtil.getFieldName(BeansUtil.getField(clazz, field)); this.value = SQLBuilder.formatValue(value); this.opt = opt; } /** * 构造方法.null or not null * * @param field 条件字段 * @param opt 条件枚举 */ private Condition(String field, QueryOpt opt, Class<?> clazz) { if (StringUtil.isBlank(field)) { throw new IllegalArgumentException("条件字段不能为空, condition field=" + field); } this.field = field; if (clazz != null) this.field = BeansUtil.getFieldName(BeansUtil.getField(clazz, field)); this.opt = opt; } /** * 返回当前条件对象表示的sql语句. * * @return sql语句 */ SQL getSql() { StringBuilder sqlText = new StringBuilder(); if (orCond != null && orCond.length > 0) { List<Object> paramList = Lists.newArrayList(); sqlText.append("("); for (Condition cond : orCond) { sqlText.append(cond.getSql().getSql()).append(" or "); paramList.addAll(cond.getSql().getParams()); } sqlText.delete(sqlText.lastIndexOf(" or "), sqlText.length()); sqlText.append(")"); return SQL.valueOf(sqlText.toString(), paramList.toArray(new Object[paramList.size()])); } else if (andCond != null && andCond.length > 0) { List<Object> paramList = Lists.newArrayList(); sqlText.append("("); for (Condition cond : andCond) { sqlText.append(cond.getSql().getSql()).append(" and "); paramList.addAll(cond.getSql().getParams()); } sqlText.delete(sqlText.lastIndexOf(" and "), sqlText.length()); sqlText.append(")"); return SQL.valueOf(sqlText.toString(), paramList.toArray(new Object[paramList.size()])); } else { sqlText.append('`').append(field).append('`').append(" ").append(opt.getSymbol()).append(" "); List<Object> paramList = Lists.newArrayList(); switch (opt) { case IN: int paramLength = Array.getLength(this.value); sqlText.append("("); for (int i = 0; i < paramLength; i++) { sqlText.append('?').append(','); Object val = Array.get(this.value, i); Class<?> clazz = val.getClass(); if (clazz == Boolean.class || clazz == Boolean.TYPE) { if ((Boolean) val) { paramList.add("1"); } else { paramList.add("0"); } } else { paramList.add(val); } } sqlText.deleteCharAt(sqlText.length() - 1); sqlText.append(")"); break; case ISNULL: break; case ISNOTNULL: break; default: sqlText.append('?'); Object value = this.value; if (value instanceof Boolean) { if ((Boolean) value) { paramList.add("1"); } else { paramList.add("0"); } } else { paramList.add(value); } break; } return SQL.valueOf(sqlText.toString(), paramList); } } @Override public String toString() { return getSql().toString(); } public static Condition eq(String field, Object value) { return eq(field, value, null); } /** * 等于条件. * * @param field 条件字段 * @param value 字段值 */ public static Condition eq(String field, Object value, Class<?> clazz) { if (value == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, value, QueryOpt.EQ, clazz); return cond; } public static Condition noteq(String field, Object value) { return noteq(field, value, null); } /** * 不等于条件. * * @param field 条件字段 * @param value 字段值 */ public static Condition noteq(String field, Object value, Class<?> clazz) { if (value == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, value, QueryOpt.NOTEQ, clazz); return cond; } public static Condition gt(String field, Object value) { return gt(field, value, null); } /** * 大于条件. * * @param field 条件字段 * @param value 字段值 */ public static Condition gt(String field, Object value, Class<?> clazz) { if (value == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, value, QueryOpt.GT, clazz); return cond; } public static Condition gte(String field, Object value) { return gte(field, value, null); } /** * 大于等于条件. * * @param field 条件字段 * @param value 字段值 */ public static Condition gte(String field, Object value, Class<?> clazz) { if (value == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, value, QueryOpt.GTE, clazz); return cond; } public static Condition lt(String field, Object value) { return lt(field, value, null); } /** * 小于条件. * * @param field 条件字段 * @param value 字段值 */ public static Condition lt(String field, Object value, Class<?> clazz) { if (value == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, value, QueryOpt.LT, clazz); return cond; } public static Condition lte(String field, Object value) { return lte(field, value, null); } /** * 小于等于条件. * * @param field 条件字段 * @param value 字段值 */ public static Condition lte(String field, Object value, Class<?> clazz) { if (value == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, value, QueryOpt.LTE, clazz); return cond; } public static Condition in(String field, List<? extends Object> values) { return in(field, values, null); } public static Condition in(String field, List<? extends Object> values, Class<?> clazz) { return in(field, clazz, values.toArray(new Object[values.size()])); } public static Condition in(String field, Set<? extends Object> values) { return in(field, values, null); } public static Condition in(String field, Set<? extends Object> values, Class<?> clazz) { return in(field, clazz, values.toArray(new Object[values.size()])); } public static Condition in(String field, Object... values) { return in(field, null, values); } /** * in操作. * * @param field 条件字段 * @param values 字段值 * @return 当前条件对象 */ public static Condition in(String field, Class<?> clazz, Object... values) { if (values == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, values, QueryOpt.IN, clazz); return cond; } public static Condition in(String field, byte[] values) { return in(field, values, null); } public static Condition in(String field, byte[] values, Class<?> clazz) { if (values == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, values, QueryOpt.IN, clazz); return cond; } public static Condition in(String field, int[] values) { return in(field, values, null); } public static Condition in(String field, int[] values, Class<?> clazz) { if (values == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, values, QueryOpt.IN, clazz); return cond; } public static Condition in(String field, short[] values) { return in(field, values, null); } public static Condition in(String field, short[] values, Class<?> clazz) { if (values == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, values, QueryOpt.IN, clazz); return cond; } public static Condition in(String field, long[] values) { return in(field, values, null); } public static Condition in(String field, long[] values, Class<?> clazz) { if (values == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, values, QueryOpt.IN, clazz); return cond; } public static Condition in(String field, float[] values) { return in(field, values, null); } public static Condition in(String field, float[] values, Class<?> clazz) { if (values == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, values, QueryOpt.IN, clazz); return cond; } public static Condition in(String field, double[] values) { return in(field, values, null); } public static Condition in(String field, double[] values, Class<?> clazz) { if (values == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, values, QueryOpt.IN, clazz); return cond; } public static Condition in(String field, boolean[] values) { return in(field, values, null); } public static Condition in(String field, boolean[] values, Class<?> clazz) { if (values == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, values, QueryOpt.IN, clazz); return cond; } public static Condition like(String field, String value) { return like(field, value, null); } /** * like查询. * * @param field 条件字段 * @param value 字段值 */ public static Condition like(String field, String value, Class<?> clazz) { if (value == null) { throw new IllegalArgumentException("参数错误, condition value=null"); } Condition cond = new Condition(field, value, QueryOpt.LIKE, clazz); return cond; } /** * or查询. * * @param conds 查询条件 */ public static Condition or(Condition... conds) { if (conds == null || conds.length < 2) { throw new IllegalArgumentException("参数错误, or查询条件最少为2个"); } Condition cond = new Condition(); cond.setOrCond(conds); return cond; } /** * and查询 * * @param conds * @return */ public static Condition and(Condition... conds) { if (conds == null || conds.length < 2) { throw new IllegalArgumentException("参数错误, and查询条件最少为2个"); } Condition cond = new Condition(); cond.setAndCond(conds); return cond; } public static Condition isNull(String field) { return isNull(field, null); } /** * 为null 查询. * * @param field 条件字段 * @param clazz class 查询条件 */ public static Condition isNull(String field, Class<?> clazz) { Condition cond = new Condition(field, QueryOpt.ISNULL, clazz); return cond; } public static Condition isNotNull(String field) { return isNotNull(field, null); } /** * 不为null查询. * * @param field 条件字段 * @param clazz class 查询条件 */ public static Condition isNotNull(String field, Class<?> clazz) { Condition cond = new Condition(field, QueryOpt.ISNOTNULL, clazz); return cond; } boolean isAndCondAllEQ() { if (andCond.length == 0) { return false; } for (Condition oneAnd : andCond) { if (oneAnd.getOpt() != QueryOpt.EQ) { return false; } } return true; } String getField() { return field; } void setField(String field) { this.field = field; } Object getValue() { return value; } void setValue(Object value) { this.value = value; } QueryOpt getOpt() { return opt; } void setOpt(QueryOpt opt) { this.opt = opt; } Condition[] getOrCond() { return orCond; } void setOrCond(Condition[] orCond) { this.orCond = orCond; } Condition[] getAndCond() { return andCond; } void setAndCond(Condition[] andCond) { this.andCond = andCond; } ConditionRelation getConditionRelation() { return conditionRelation; } void setConditionRelation(ConditionRelation conditionRelation) { this.conditionRelation = conditionRelation; } }