All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.beangle.commons.dao.query.builder.SqlQuery Maven / Gradle / Ivy

The newest version!
/*
 * Beangle, Agile Development Scaffold and Toolkits.
 *
 * Copyright © 2005, The Beangle Software.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 */
package org.beangle.commons.dao.query.builder;

import java.util.Collection;
import java.util.List;
import java.util.Map;

import org.beangle.commons.collection.CollectUtils;
import org.beangle.commons.collection.Order;
import org.beangle.commons.collection.page.PageLimit;
import org.beangle.commons.dao.query.Lang;
import org.beangle.commons.dao.query.Query;
import org.beangle.commons.lang.Strings;

/**
 * sql查询
 *
 * @author chaostone
 * @version $Id: $
 */
public class SqlQuery extends AbstractQuery {

  /** Constant INNER_JOIN=" left join " */
  public static final String INNER_JOIN = " left join ";

  /** Constant OUTER_JOIN=" outer join " */
  public static final String OUTER_JOIN = " outer join ";

  /** Constant LEFT_OUTER_JOIN=" left outer join " */
  public static final String LEFT_OUTER_JOIN = " left outer join ";

  /** Constant RIGHT_OUTER_JOIN=" right outer join " */
  public static final String RIGHT_OUTER_JOIN = " right outer join ";

  protected String select;

  protected String from;

  protected List conditions = CollectUtils.newArrayList();

  protected List orders = CollectUtils.newArrayList();

  protected List groups = CollectUtils.newArrayList();

  /**
   * 

* Constructor for SqlQuery. *

*/ public SqlQuery() { super(); } /** *

* Constructor for SqlQuery. *

* * @param queryStr a {@link java.lang.String} object. */ public SqlQuery(final String queryStr) { super(); this.queryStr = queryStr; } /** *

* add. *

* * @param condition a {@link org.beangle.commons.dao.query.builder.Condition} object. * @return a {@link org.beangle.commons.dao.query.builder.SqlQuery} object. */ public SqlQuery add(final Condition condition) { conditions.add(condition); return this; } /** * 添加一组条件
* query中不能添加条件集合作为一个条件,因此这里命名没有采用有区别性的addAll * * @param cons a {@link java.util.Collection} object. * @return a {@link org.beangle.commons.dao.query.builder.SqlQuery} object. */ public SqlQuery add(final Collection cons) { conditions.addAll(cons); return this; } /** *

* addOrder. *

* * @param order a {@link org.beangle.commons.collection.Order} object. * @return a {@link org.beangle.commons.dao.query.builder.SqlQuery} object. */ public SqlQuery addOrder(final Order order) { if (null != order) { this.orders.add(order); } return this; } /** *

* addOrder. *

* * @param orders a {@link java.util.List} object. * @return a {@link org.beangle.commons.dao.query.builder.SqlQuery} object. */ public SqlQuery addOrder(final List orders) { if (null != orders) { this.orders.addAll(orders); } return this; } /** *

* Getter for the field select. *

* * @return a {@link java.lang.String} object. */ public String getSelect() { return select; } /** *

* Setter for the field select. *

* * @param select a {@link java.lang.String} object. */ public void setSelect(final String select) { if (null == select) { this.select = null; } else { if (Strings.contains(select.toLowerCase(), "select")) { this.select = select; } else { this.select = "select " + select; } } } /** *

* Getter for the field conditions. *

* * @return a {@link java.util.List} object. */ public List getConditions() { return conditions; } /** *

* Setter for the field conditions. *

* * @param conditions a {@link java.util.List} object. */ public void setConditions(final List conditions) { this.conditions = conditions; } /** *

* Getter for the field from. *

* * @return a {@link java.lang.String} object. */ public String getFrom() { return from; } /** *

* Setter for the field from. *

* * @param from a {@link java.lang.String} object. */ public void setFrom(final String from) { if (null == from) { this.from = null; } else { if (Strings.contains(from.toLowerCase(), "from")) { this.from = from; } else { this.from = " from " + from; } } } /** *

* Getter for the field orders. *

* * @return a {@link java.util.List} object. */ public List getOrders() { return orders; } /** *

* Setter for the field orders. *

* * @param orders a {@link java.util.List} object. */ public void setOrders(final List orders) { this.orders = orders; } /** *

* Getter for the field groups. *

* * @return a {@link java.util.List} object. */ public List getGroups() { return groups; } /** *

* Setter for the field groups. *

* * @param groups a {@link java.util.List} object. */ public void setGroups(final List groups) { this.groups = groups; } /** *

* groupBy. *

* * @param what a {@link java.lang.String} object. * @return a {@link org.beangle.commons.dao.query.builder.SqlQuery} object. */ public SqlQuery groupBy(final String what) { if (Strings.isNotEmpty(what)) { groups.add(what); } return this; } /** * 生成查询语句(如果查询语句已经存在则不进行生成) * * @return a {@link java.lang.String} object. */ public String toQueryString() { if (Strings.isNotEmpty(queryStr)) { return queryStr; } else { return genQueryString(true); } } /** *

* toCountString. *

* * @return a {@link java.lang.String} object. */ public String toCountString() { if (Strings.isNotEmpty(countStr)) { return countStr; } else { return "select count(*) from (" + genQueryString(false) + ")"; } } /** *

* genQueryString. *

* * @param hasOrder a boolean. * @return a {@link java.lang.String} object. */ protected String genQueryString(final boolean hasOrder) { if (null == from) { return queryStr; } final StringBuilder buf = new StringBuilder(50); buf.append((select == null) ? "" : select).append(' ').append(from); if (!conditions.isEmpty()) { buf.append(" where ").append(Conditions.toQueryString(conditions)); } if (!groups.isEmpty()) { buf.append(" group by "); for (final String groupBy : groups) { buf.append(groupBy).append(','); } buf.deleteCharAt(buf.length() - 1); } if (hasOrder && !CollectUtils.isEmpty(orders)) { buf.append(' ').append(Order.toSortString(orders)); } return buf.toString(); } /** *

* getParams. *

* * @return a {@link java.util.Map} object. */ public Map getParams() { return (null == params) ? Conditions.getParamMap(conditions) : CollectUtils.newHashMap(params); } /** *

* build. *

* * @return a {@link org.beangle.commons.dao.query.Query} object. */ public Query build() { QueryBean queryBean = new QueryBean(); queryBean.setStatement(toQueryString()); queryBean.setParams(CollectUtils.newHashMap(getParams())); if (null != limit) { queryBean.setLimit(new PageLimit(limit.getPageIndex(), limit.getPageSize())); } queryBean.setCountStatement(toCountString()); queryBean.setCacheable(cacheable); queryBean.setLang(getLang()); return queryBean; } /** *

* getLang. *

* * @return a {@link org.beangle.commons.dao.query.Lang} object. */ protected Lang getLang() { return Lang.SQL; } /** {@inheritDoc} */ public SqlQuery limit(PageLimit limit) { this.limit = limit; return this; } /** {@inheritDoc} */ public SqlQuery params(Map newParams) { this.params = CollectUtils.newHashMap(newParams); return this; } }