📄 sqljdbcutil.java
字号:
/* * $Id: SqlJdbcUtil.java 6095 2005-11-09 01:38:54Z jonesde $ * * Copyright (c) 2001-2005 The Open For Business Project - www.ofbiz.org * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR * THE USE OR OTHER DEALINGS IN THE SOFTWARE. */package org.ofbiz.entity.jdbc;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.ObjectInputStream;import java.io.Reader;import java.math.BigDecimal;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Clob;import java.util.Collection;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import java.util.TreeSet;import javolution.util.FastMap;import org.ofbiz.base.util.Debug;import org.ofbiz.base.util.ObjectType;import org.ofbiz.base.util.UtilValidate;import org.ofbiz.entity.GenericDataSourceException;import org.ofbiz.entity.GenericEntity;import org.ofbiz.entity.GenericEntityException;import org.ofbiz.entity.GenericModelException;import org.ofbiz.entity.GenericNotImplementedException;import org.ofbiz.entity.GenericValue;import org.ofbiz.entity.condition.EntityConditionParam;import org.ofbiz.entity.condition.OrderByList;import org.ofbiz.entity.config.DatasourceInfo;import org.ofbiz.entity.datasource.GenericDAO;import org.ofbiz.entity.model.ModelEntity;import org.ofbiz.entity.model.ModelField;import org.ofbiz.entity.model.ModelFieldType;import org.ofbiz.entity.model.ModelFieldTypeReader;import org.ofbiz.entity.model.ModelKeyMap;import org.ofbiz.entity.model.ModelViewEntity;/** * GenericDAO Utility methods for general tasks * * @author <a href="mailto:jonesde@ofbiz.org">David E. Jones</a> * @author <a href="mailto:chris_maurer@altavista.com">Chris Maurer</a> * @author <a href="mailto:jaz@ofbiz.org">Andy Zeneski</a> * @author <a href="mailto:jdonnerstag@eds.de">Juergen Donnerstag</a> * @author <a href="mailto:peterm@miraculum.com">Peter Moon</a> * @version $Rev: 6095 $ * @since 2.0 */public class SqlJdbcUtil { public static final String module = GenericDAO.class.getName(); public static final int CHAR_BUFFER_SIZE = 4096; /** Makes the FROM clause and when necessary the JOIN clause(s) as well */ public static String makeFromClause(ModelEntity modelEntity, DatasourceInfo datasourceInfo) throws GenericEntityException { StringBuffer sql = new StringBuffer(" FROM "); if (modelEntity instanceof ModelViewEntity) { ModelViewEntity modelViewEntity = (ModelViewEntity) modelEntity; if ("ansi".equals(datasourceInfo.joinStyle) || "ansi-no-parenthesis".equals(datasourceInfo.joinStyle)) { boolean useParenthesis = true; if ("ansi-no-parenthesis".equals(datasourceInfo.joinStyle)) { useParenthesis = false; } // FROM clause: in this case will be a bunch of joins that correspond with the view-links // BIG NOTE on the JOIN clauses: the order of joins is determined by the order of the // view-links; for more flexible order we'll have to figure something else out and // extend the DTD for the nested view-link elements or something // At this point it is assumed that in each view-link the left hand alias will // either be the first alias in the series or will already be in a previous // view-link and already be in the big join; SO keep a set of all aliases // in the join so far and if the left entity alias isn't there yet, and this // isn't the first one, throw an exception Set joinedAliasSet = new TreeSet(); // TODO: at view-link read time make sure they are ordered properly so that each // left hand alias after the first view-link has already been linked before StringBuffer openParens = null; if (useParenthesis) openParens = new StringBuffer(); StringBuffer restOfStatement = new StringBuffer(); for (int i = 0; i < modelViewEntity.getViewLinksSize(); i++) { // don't put starting parenthesis if (i > 0 && useParenthesis) openParens.append('('); ModelViewEntity.ModelViewLink viewLink = modelViewEntity.getViewLink(i); ModelEntity linkEntity = modelViewEntity.getMemberModelEntity(viewLink.getEntityAlias()); ModelEntity relLinkEntity = modelViewEntity.getMemberModelEntity(viewLink.getRelEntityAlias()); // ModelViewEntity.ModelMemberEntity linkMemberEntity = modelViewEntity.getMemberModelMemberEntity(viewLink.getEntityAlias()); // ModelViewEntity.ModelMemberEntity relLinkMemberEntity = modelViewEntity.getMemberModelMemberEntity(viewLink.getRelEntityAlias()); if (i == 0) { // this is the first referenced member alias, so keep track of it for future use... restOfStatement.append(makeViewTable(linkEntity, datasourceInfo)); //another possible one that some dbs might need, but not sure of any yet: restOfStatement.append(" AS "); restOfStatement.append(" "); restOfStatement.append(viewLink.getEntityAlias()); joinedAliasSet.add(viewLink.getEntityAlias()); } else { // make sure the left entity alias is already in the join... if (!joinedAliasSet.contains(viewLink.getEntityAlias())) { throw new GenericModelException("Tried to link the " + viewLink.getEntityAlias() + " alias to the " + viewLink.getRelEntityAlias() + " alias of the " + modelViewEntity.getEntityName() + " view-entity, but it is not the first view-link and has not been included in a previous view-link. In other words, the left/main alias isn't connected to the rest of the member-entities yet."); } } // now put the rel (right) entity alias into the set that is in the join joinedAliasSet.add(viewLink.getRelEntityAlias()); if (viewLink.isRelOptional()) { restOfStatement.append(" LEFT OUTER JOIN "); } else { restOfStatement.append(" INNER JOIN "); } restOfStatement.append(makeViewTable(relLinkEntity, datasourceInfo)); //another possible one that some dbs might need, but not sure of any yet: restOfStatement.append(" AS "); restOfStatement.append(" "); restOfStatement.append(viewLink.getRelEntityAlias()); restOfStatement.append(" ON "); StringBuffer condBuffer = new StringBuffer(); for (int j = 0; j < viewLink.getKeyMapsSize(); j++) { ModelKeyMap keyMap = viewLink.getKeyMap(j); ModelField linkField = linkEntity.getField(keyMap.getFieldName()); if (linkField == null) { throw new GenericModelException("Invalid field name in view-link key-map for the " + viewLink.getEntityAlias() + " and the " + viewLink.getRelEntityAlias() + " member-entities of the " + modelViewEntity.getEntityName() + " view-entity; the field [" + keyMap.getFieldName() + "] does not exist on the [" + linkEntity.getEntityName() + "] entity."); } ModelField relLinkField = relLinkEntity.getField(keyMap.getRelFieldName()); if (relLinkField == null) { throw new GenericModelException("Invalid related field name in view-link key-map for the " + viewLink.getEntityAlias() + " and the " + viewLink.getRelEntityAlias() + " member-entities of the " + modelViewEntity.getEntityName() + " view-entity; the field [" + keyMap.getRelFieldName() + "] does not exist on the [" + relLinkEntity.getEntityName() + "] entity."); } if (condBuffer.length() > 0) { condBuffer.append(" AND "); } condBuffer.append(viewLink.getEntityAlias()); condBuffer.append("."); condBuffer.append(filterColName(linkField.getColName())); condBuffer.append(" = "); condBuffer.append(viewLink.getRelEntityAlias()); condBuffer.append("."); condBuffer.append(filterColName(relLinkField.getColName())); } if (condBuffer.length() == 0) { throw new GenericModelException("No view-link/join key-maps found for the " + viewLink.getEntityAlias() + " and the " + viewLink.getRelEntityAlias() + " member-entities of the " + modelViewEntity.getEntityName() + " view-entity."); } restOfStatement.append(condBuffer.toString()); // don't put ending parenthesis if (i < (modelViewEntity.getViewLinksSize() - 1) && useParenthesis) restOfStatement.append(')'); } if (useParenthesis) sql.append(openParens.toString()); sql.append(restOfStatement.toString()); // handle tables not included in view-link Iterator meIter = modelViewEntity.getMemberModelMemberEntities().entrySet().iterator(); boolean fromEmpty = restOfStatement.length() == 0; while (meIter.hasNext()) { Map.Entry entry = (Map.Entry) meIter.next(); ModelEntity fromEntity = modelViewEntity.getMemberModelEntity((String) entry.getKey()); if (!joinedAliasSet.contains((String) entry.getKey())) { if (!fromEmpty) sql.append(", "); fromEmpty = false; sql.append(makeViewTable(fromEntity, datasourceInfo)); sql.append(" "); sql.append((String) entry.getKey()); } } } else if ("theta-oracle".equals(datasourceInfo.joinStyle) || "theta-mssql".equals(datasourceInfo.joinStyle)) { // FROM clause Iterator meIter = modelViewEntity.getMemberModelMemberEntities().entrySet().iterator(); while (meIter.hasNext()) { Map.Entry entry = (Map.Entry) meIter.next(); ModelEntity fromEntity = modelViewEntity.getMemberModelEntity((String) entry.getKey()); sql.append(makeViewTable(fromEntity, datasourceInfo)); sql.append(" "); sql.append((String) entry.getKey()); if (meIter.hasNext()) sql.append(", "); } // JOIN clause(s): none needed, all the work done in the where clause for theta-oracle } else { throw new GenericModelException("The join-style " + datasourceInfo.joinStyle + " is not yet supported"); } } else { sql.append(modelEntity.getTableName(datasourceInfo)); } return sql.toString(); } /** Makes a WHERE clause String with "<col name>=?" if not null or "<col name> IS null" if null, all AND separated */ public static String makeWhereStringFromFields(List modelFields, Map fields, String operator) { return makeWhereStringFromFields(modelFields, fields, operator, null); } /** Makes a WHERE clause String with "<col name>=?" if not null or "<col name> IS null" if null, all AND separated */ public static String makeWhereStringFromFields(List modelFields, Map fields, String operator, List entityConditionParams) { if (modelFields.size() < 1) { return ""; } StringBuffer returnString = new StringBuffer(""); Iterator iter = modelFields.iterator(); while (iter.hasNext()) { Object item = iter.next(); Object name = null; ModelField modelField = null; if (item instanceof ModelField) { modelField = (ModelField) item; returnString.append(modelField.getColName()); name = modelField.getName(); } else { returnString.append(item); name = item; } Object fieldValue = fields.get(name); if (fieldValue != null && fieldValue != GenericEntity.NULL_FIELD) { returnString.append('='); addValue(returnString, modelField, fieldValue, entityConditionParams); } else { returnString.append(" IS NULL"); } if (iter.hasNext()) { returnString.append(' '); returnString.append(operator); returnString.append(' '); } } return returnString.toString(); } public static String makeWhereClause(ModelEntity modelEntity, List modelFields, Map fields, String operator, String joinStyle) throws GenericEntityException { StringBuffer whereString = new StringBuffer(""); if (modelFields != null && modelFields.size() > 0) { whereString.append(makeWhereStringFromFields(modelFields, fields, "AND")); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -