📄 genericdao.java
字号:
if (sqlP.next()) {
for (int j = 0; j < partialFields.size(); j++) {
ModelField curField = (ModelField) partialFields.get(j);
SqlJdbcUtil.getValue(sqlP.getResultSet(), j + 1, curField, entity, modelFieldTypeReader);
}
entity.synchronizedWithDatasource();
} else {
// Debug.logWarning("[GenericDAO.select]: select failed, result set was empty.", module);
throw new GenericEntityNotFoundException("Result set was empty for entity: " + entity.toString());
}
} finally {
sqlP.close();
}
}
public List selectByAnd(ModelEntity modelEntity, Map fields, List orderBy) throws GenericEntityException {
if (modelEntity == null) {
return null;
}
EntityCondition entityCondition = null;
if (fields != null) {
entityCondition = new EntityFieldMap(fields, EntityOperator.AND);
}
EntityListIterator entityListIterator = null;
try {
entityListIterator = selectListIteratorByCondition(modelEntity, entityCondition, null, null, orderBy, null);
return entityListIterator.getCompleteList();
} finally {
if (entityListIterator != null) {
entityListIterator.close();
}
}
}
public List selectByOr(ModelEntity modelEntity, Map fields, List orderBy) throws GenericEntityException {
if (modelEntity == null) {
return null;
}
EntityCondition entityCondition = null;
if (fields != null) {
entityCondition = new EntityFieldMap(fields, EntityOperator.OR);
}
EntityListIterator entityListIterator = null;
try {
entityListIterator = selectListIteratorByCondition(modelEntity, entityCondition, null, null, orderBy, null);
return entityListIterator.getCompleteList();
} finally {
if (entityListIterator != null) {
entityListIterator.close();
}
}
}
/* ====================================================================== */
/* ====================================================================== */
/** Finds GenericValues by the conditions specified in the EntityCondition object, the the EntityCondition javadoc for more details.
*@param modelEntity The ModelEntity of the Entity as defined in the entity XML file
*@param entityCondition The EntityCondition object that specifies how to constrain this query
*@param fieldsToSelect The fields of the named entity to get from the database; if empty or null all fields will be retreived
*@param orderBy The fields of the named entity to order the query by; optionally add a " ASC" for ascending or " DESC" for descending
*@return List of GenericValue objects representing the result
*/
public List selectByCondition(ModelEntity modelEntity, EntityCondition entityCondition, Collection fieldsToSelect, List orderBy) throws GenericEntityException {
EntityListIterator entityListIterator = null;
try {
entityListIterator = selectListIteratorByCondition(modelEntity, entityCondition, null, fieldsToSelect, orderBy, null);
return entityListIterator.getCompleteList();
} finally {
if (entityListIterator != null) {
entityListIterator.close();
}
}
}
/** Finds GenericValues by the conditions specified in the EntityCondition object, the the EntityCondition javadoc for more details.
*@param modelEntity The ModelEntity of the Entity as defined in the entity XML file
*@param whereEntityCondition The EntityCondition object that specifies how to constrain this query before any groupings are done (if this is a view entity with group-by aliases)
*@param havingEntityCondition The EntityCondition object that specifies how to constrain this query after any groupings are done (if this is a view entity with group-by aliases)
*@param fieldsToSelect The fields of the named entity to get from the database; if empty or null all fields will be retreived
*@param orderBy The fields of the named entity to order the query by; optionally add a " ASC" for ascending or " DESC" for descending
*@param findOptions An instance of EntityFindOptions that specifies advanced query options. See the EntityFindOptions JavaDoc for more details.
*@return EntityListIterator representing the result of the query: NOTE THAT THIS MUST BE CLOSED WHEN YOU ARE
* DONE WITH IT, AND DON'T LEAVE IT OPEN TOO LONG BEACUSE IT WILL MAINTAIN A DATABASE CONNECTION.
*/
public EntityListIterator selectListIteratorByCondition(ModelEntity modelEntity, EntityCondition whereEntityCondition,
EntityCondition havingEntityCondition, Collection fieldsToSelect, List orderBy, EntityFindOptions findOptions)
throws GenericEntityException {
if (modelEntity == null) {
return null;
}
// if no find options passed, use default
if (findOptions == null) findOptions = new EntityFindOptions();
boolean verboseOn = Debug.verboseOn();
if (verboseOn) {
// put this inside an if statement so that we don't have to generate the string when not used...
Debug.logVerbose("Doing selectListIteratorByCondition with whereEntityCondition: " + whereEntityCondition, module);
}
// make two ArrayLists of fields, one for fields to select and the other for where clause fields (to find by)
List selectFields = new ArrayList();
if (fieldsToSelect != null && fieldsToSelect.size() > 0) {
Set tempKeys = new HashSet(fieldsToSelect);
for (int fi = 0; fi < modelEntity.getFieldsSize(); fi++) {
ModelField curField = modelEntity.getField(fi);
if (tempKeys.contains(curField.getName())) {
selectFields.add(curField);
tempKeys.remove(curField.getName());
}
}
if (tempKeys.size() > 0) {
throw new GenericModelException("In selectListIteratorByCondition invalid field names specified: " + tempKeys.toString());
}
} else {
selectFields = modelEntity.getFieldsCopy();
}
StringBuffer sqlBuffer = new StringBuffer("SELECT ");
if (findOptions.getDistinct()) {
sqlBuffer.append("DISTINCT ");
}
if (selectFields.size() > 0) {
sqlBuffer.append(modelEntity.colNameString(selectFields, ", ", "", datasourceInfo.aliasViews));
} else {
sqlBuffer.append("*");
}
// FROM clause and when necessary the JOIN or LEFT JOIN clause(s) as well
sqlBuffer.append(SqlJdbcUtil.makeFromClause(modelEntity, datasourceInfo));
// WHERE clause
StringBuffer whereString = new StringBuffer();
String entityCondWhereString = "";
List whereEntityConditionParams = new LinkedList();
if (whereEntityCondition != null) {
entityCondWhereString = whereEntityCondition.makeWhereString(modelEntity, whereEntityConditionParams);
}
String viewClause = SqlJdbcUtil.makeViewWhereClause(modelEntity, datasourceInfo.joinStyle);
if (viewClause.length() > 0) {
if (entityCondWhereString.length() > 0) {
whereString.append("(");
whereString.append(entityCondWhereString);
whereString.append(") AND ");
}
whereString.append(viewClause);
} else {
whereString.append(entityCondWhereString);
}
if (whereString.length() > 0) {
sqlBuffer.append(" WHERE ");
sqlBuffer.append(whereString.toString());
}
// GROUP BY clause for view-entity
if (modelEntity instanceof ModelViewEntity) {
ModelViewEntity modelViewEntity = (ModelViewEntity) modelEntity;
String groupByString = modelViewEntity.colNameString(modelViewEntity.getGroupBysCopy(), ", ", "", false);
if (UtilValidate.isNotEmpty(groupByString)) {
sqlBuffer.append(" GROUP BY ");
sqlBuffer.append(groupByString);
}
}
// HAVING clause
String entityCondHavingString = "";
List havingEntityConditionParams = new LinkedList();
if (havingEntityCondition != null) {
entityCondHavingString = havingEntityCondition.makeWhereString(modelEntity, havingEntityConditionParams);
}
if (entityCondHavingString.length() > 0) {
sqlBuffer.append(" HAVING ");
sqlBuffer.append(entityCondHavingString);
}
// ORDER BY clause
sqlBuffer.append(SqlJdbcUtil.makeOrderByClause(modelEntity, orderBy, datasourceInfo));
String sql = sqlBuffer.toString();
SQLProcessor sqlP = new SQLProcessor(helperName);
sqlP.prepareStatement(sql, findOptions.getSpecifyTypeAndConcur(), findOptions.getResultSetType(), findOptions.getResultSetConcurrency());
if (verboseOn) {
// put this inside an if statement so that we don't have to generate the string when not used...
Debug.logVerbose("Setting the whereEntityConditionParams: " + whereEntityConditionParams, module);
}
// set all of the values from the Where EntityCondition
Iterator whereEntityConditionParamsIter = whereEntityConditionParams.iterator();
while (whereEntityConditionParamsIter.hasNext()) {
EntityConditionParam whereEntityConditionParam = (EntityConditionParam) whereEntityConditionParamsIter.next();
SqlJdbcUtil.setValue(sqlP, whereEntityConditionParam.getModelField(), modelEntity.getEntityName(), whereEntityConditionParam.getFieldValue(), modelFieldTypeReader);
}
if (verboseOn) {
// put this inside an if statement so that we don't have to generate the string when not used...
Debug.logVerbose("Setting the havingEntityConditionParams: " + havingEntityConditionParams, module);
}
// set all of the values from the Having EntityCondition
Iterator havingEntityConditionParamsIter = havingEntityConditionParams.iterator();
while (havingEntityConditionParamsIter.hasNext()) {
EntityConditionParam havingEntityConditionParam = (EntityConditionParam) havingEntityConditionParamsIter.next();
SqlJdbcUtil.setValue(sqlP, havingEntityConditionParam.getModelField(), modelEntity.getEntityName(), havingEntityConditionParam.getFieldValue(), modelFieldTypeReader);
}
sqlP.executeQuery();
return new EntityListIterator(sqlP, modelEntity, selectFields, modelFieldTypeReader);
}
public List selectByMultiRelation(GenericValue value, ModelRelation modelRelationOne, ModelEntity modelEntityOne,
ModelRelation modelRelationTwo, ModelEntity modelEntityTwo, List orderBy) throws GenericEntityException {
SQLProcessor sqlP = new SQLProcessor(helperName);
// get the tables names
String atable = modelEntityOne.getTableName(datasourceInfo);
String ttable = modelEntityTwo.getTableName(datasourceInfo);
// get the column name string to select
StringBuffer selsb = new StringBuffer();
ArrayList collist = new ArrayList();
ArrayList fldlist = new ArrayList();
for (Iterator iterator = modelEntityTwo.getFieldsIterator(); iterator.hasNext();) {
ModelField mf = (ModelField) iterator.next();
collist.add(mf.getColName());
fldlist.add(mf.getName());
selsb.append(ttable + "." + mf.getColName());
if (iterator.hasNext()) {
selsb.append(", ");
} else {
selsb.append(" ");
}
}
// construct assoc->target relation string
int kmsize = modelRelationTwo.getKeyMapsSize();
StringBuffer wheresb = new StringBuffer();
for (int i = 0; i < kmsize; i++) {
ModelKeyMap mkm = modelRelationTwo.getKeyMap(i);
String lfname = mkm.getFieldName();
String rfname = mkm.getRelFieldName();
if (wheresb.length() > 0) {
wheresb.append(" AND ");
}
wheresb.append(atable + "." + modelEntityOne.getField(lfname).getColName() + " = " + ttable + "." + modelEntityTwo.getField(rfname).getColName());
}
// construct the source entity qualifier
// get the fields from relation description
kmsize = modelRelationOne.getKeyMapsSize();
HashMap bindMap = new HashMap();
for (int i = 0; i < kmsize; i++) {
// get the equivalent column names in the relation
ModelKeyMap mkm = modelRelationOne.getKeyMap(i);
String sfldname = mkm.getFieldName();
String lfldname = mkm.getRelFieldName();
ModelField amf = modelEntityOne.getField(lfldname);
String lcolname = amf.getColName();
Object rvalue = value.get(sfldname);
bindMap.put(amf, rvalue);
// construct one condition
if (wheresb.length() > 0) {
wheresb.append(" AND ");
}
wheresb.append(atable + "." + lcolname + " = ? ");
}
// construct a join sql query
StringBuffer sqlsb = new StringBuffer();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -