package com.vci.server.query.service; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.hibernate.SQLQuery; import org.hibernate.Session; import com.vci.omd.constants.BusinessConstants; import com.vci.omd.constants.LinkConstants; import com.vci.server.base.exception.ExceptionLocalHandler; import com.vci.server.base.persistence.dao.HibernateSessionFactory; import com.vci.server.base.utility.OmdHelper; import com.vci.server.cache.OMCacheProvider; import com.vci.server.query.parsers.Parser; import com.vci.server.query.util.QTSqlUtil; import com.vci.corba.omd.data.AttributeValue; import com.vci.corba.omd.data.BusinessObject; import com.vci.corba.omd.data.LinkObject; import com.vci.corba.omd.ltm.LinkType; import com.vci.corba.query.data.BOAndLO; import com.vci.common.exception.VciExceptionTool; import com.vci.common.qt.object.QTConstants; import com.vci.common.qt.object.QueryTemplate; import com.vci.common.qt.object.Version; import com.vci.corba.common.VCIError; /** * 分段策略查询 * 当链接查询多个业务类型时, 为满足递归查询实行二次查询:第一次查询link表,第二次分段查询btm表 * @author zhouhui * */ public class QueryObjectPartationStrategy{ private final int PARTIONSIZE = 500; private static QueryObjectPartationStrategy queryObj = null; private VCIError getLocalVciError(String key, Throwable e) { VCIError error = new VCIError(key, new String[]{VciExceptionTool.getExceptionStr(e), VciExceptionTool.getExceptionDetail(e)}); VCIError rsError = ExceptionLocalHandler.getInstance().getLocalString(error, "PLMOQ"); return rsError; } public static QueryObjectPartationStrategy getInstance(){ if(queryObj == null){ queryObj = new QueryObjectPartationStrategy(); } return queryObj; } /** * 解析QueryTemplate 为sql * 执行sql, 返回结果 * @param queryTemplate * @return * @throws Throwable */ public List findBtmObjects(QueryTemplate queryTemplate) throws Throwable{ List clauseList = queryTemplate.getClauseList(); // 当clauseList中含有*时, 应当解析为BtmObject的全部属性 if (clauseList.contains("*") || queryTemplate.isQueryChildren()) { clauseList = getAllAbNamesForBtm(queryTemplate.getBtmType()); } queryTemplate.setClauseList(clauseList); Parser parser = new Parser(queryTemplate); String sql = parser.parseToSql(); List objList = executeSqlForBtm(clauseList, sql); return objList; } /** * @param clauseList * @param sql * @return */ private List executeSqlForBtm(List clauseList, String sql){ List objList = new ArrayList(); Session session = HibernateSessionFactory.getSession(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ BusinessObject bo = new BusinessObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 再判断Object // if((list.get(i)) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object obj_ = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); ab.attrName = abName; ab.attrVal = String.valueOf(obj_ == null ? "" : obj_); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj_ = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj_ == null ? "" : obj_); // abArray[0] = ab; // // } bo.newAttrValList = new AttributeValue[0]; bo.hisAttrValList = abArray; //为btm的系统属性赋值 int k = 0; bo.oid = abArray[k++].attrVal; bo.revisionid = abArray[k++].attrVal; bo.nameoid = abArray[k++].attrVal; bo.btName = abArray[k++].attrVal; bo.isLastR = Short.parseShort(abArray[k++].attrVal) != 0; bo.isFirstR = Short.parseShort(abArray[k++].attrVal) != 0; bo.isLastV = Short.parseShort(abArray[k++].attrVal) != 0; bo.isFirstV = Short.parseShort(abArray[k++].attrVal) != 0; bo.creator = abArray[k++].attrVal; bo.createTime = Integer.valueOf(abArray[k++].attrVal); bo.modifier = abArray[k++].attrVal; bo.modifyTime = Integer.valueOf(abArray[k++].attrVal); bo.revisionRule = abArray[k++].attrVal; bo.versionRule = abArray[k++].attrVal; bo.revisionSeq = Short.parseShort(abArray[k++].attrVal); bo.revisionValue = abArray[k++].attrVal; bo.versionSeq = Short.parseShort(abArray[k++].attrVal); bo.versionValue = abArray[k++].attrVal; bo.lctId = abArray[k++].attrVal; bo.lcStatus = abArray[k++].attrVal; bo.ts = Integer.valueOf(abArray[k++].attrVal); bo.id = abArray[k++].attrVal; bo.name = abArray[k++].attrVal; bo.description = abArray[k++].attrVal; bo.owner = abArray[k++].attrVal; // bo.checkinBy = abArray[k++].attrVal; // bo.checkinTime = abArray[k++].attrVal; // bo.checkoutBy = abArray[k++].attrVal; // bo.checkoutTime = abArray[k++].attrVal; bo.fromVersion = abArray[k++].attrVal; objList.add(bo); } return objList; } /** * Map * key: * 最新版本最新版次:nameOId * 当前版本最新版次:revisonOId * 其他: OId * @param clauseList * @param sql * @return */ public Map executeSqlForBtmLRLV(List clauseList, String sql){ Map bos = new HashMap(); Session session = HibernateSessionFactory.getSession(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ BusinessObject bo = new BusinessObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 再判断Object // if((list.get(i)) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object obj_ = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); ab.attrName = abName; ab.attrVal = String.valueOf(obj_ == null ? "" : obj_); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj_ = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj_ == null ? "" : obj_); // abArray[0] = ab; // // } bo.newAttrValList = new AttributeValue[0]; bo.hisAttrValList = abArray; //为btm的系统属性赋值 int k = 0; bo.oid = abArray[k++].attrVal; bo.revisionid = abArray[k++].attrVal; bo.nameoid = abArray[k++].attrVal; bo.btName = abArray[k++].attrVal; bo.isLastR = Short.parseShort(abArray[k++].attrVal) != 0; bo.isFirstR = Short.parseShort(abArray[k++].attrVal) != 0; bo.isLastV = Short.parseShort(abArray[k++].attrVal) != 0; bo.isFirstV = Short.parseShort(abArray[k++].attrVal) != 0; bo.creator = abArray[k++].attrVal; bo.createTime = Integer.valueOf(abArray[k++].attrVal); bo.modifier = abArray[k++].attrVal; bo.modifyTime = Integer.valueOf(abArray[k++].attrVal); bo.revisionRule = abArray[k++].attrVal; bo.versionRule = abArray[k++].attrVal; bo.revisionSeq = Short.parseShort(abArray[k++].attrVal); bo.revisionValue = abArray[k++].attrVal; bo.versionSeq = Short.parseShort(abArray[k++].attrVal); bo.versionValue = abArray[k++].attrVal; bo.lctId = abArray[k++].attrVal; bo.lcStatus = abArray[k++].attrVal; bo.ts = Integer.valueOf(abArray[k++].attrVal); bo.id = abArray[k++].attrVal; bo.name = abArray[k++].attrVal; bo.description = abArray[k++].attrVal; bo.owner = abArray[k++].attrVal; // bo.checkinBy = abArray[k++].attrVal; // bo.checkinTime = abArray[k++].attrVal; // bo.checkoutBy = abArray[k++].attrVal; // bo.checkoutTime = abArray[k++].attrVal; bo.fromVersion = abArray[k++].attrVal; bos.put(bo.nameoid, bo); } return bos; } /** * Map * key: * 最新版本最新版次:nameOId * 当前版本最新版次:revisonOId * 其他: OId * @param clauseList * @param sql * @return */ public Map executeSqlForBtmCRLV(List clauseList, String sql){ Map bos = new HashMap(); Session session = HibernateSessionFactory.getSession(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ BusinessObject bo = new BusinessObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 再判断Object // if((list.get(i)) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object obj_ = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); ab.attrName = abName; ab.attrVal = String.valueOf(obj_ == null ? "" : obj_); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj_ = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj_ == null ? "" : obj_); // abArray[0] = ab; // // } bo.newAttrValList = new AttributeValue[0]; bo.hisAttrValList = abArray; //为btm的系统属性赋值 int k = 0; bo.oid = abArray[k++].attrVal; bo.revisionid = abArray[k++].attrVal; bo.nameoid = abArray[k++].attrVal; bo.btName = abArray[k++].attrVal; bo.isLastR = Short.parseShort(abArray[k++].attrVal) != 0; bo.isFirstR = Short.parseShort(abArray[k++].attrVal) != 0; bo.isLastV = Short.parseShort(abArray[k++].attrVal) != 0; bo.isFirstV = Short.parseShort(abArray[k++].attrVal) != 0; bo.creator = abArray[k++].attrVal; bo.createTime = Integer.valueOf(abArray[k++].attrVal); bo.modifier = abArray[k++].attrVal; bo.modifyTime = Integer.valueOf(abArray[k++].attrVal); bo.revisionRule = abArray[k++].attrVal; bo.versionRule = abArray[k++].attrVal; bo.revisionSeq = Short.parseShort(abArray[k++].attrVal); bo.revisionValue = abArray[k++].attrVal; bo.versionSeq = Short.parseShort(abArray[k++].attrVal); bo.versionValue = abArray[k++].attrVal; bo.lctId = abArray[k++].attrVal; bo.lcStatus = abArray[k++].attrVal; bo.ts = Integer.valueOf(abArray[k++].attrVal); bo.id = abArray[k++].attrVal; bo.name = abArray[k++].attrVal; bo.description = abArray[k++].attrVal; bo.owner = abArray[k++].attrVal; // bo.checkinBy = abArray[k++].attrVal; // bo.checkinTime = abArray[k++].attrVal; // bo.checkoutBy = abArray[k++].attrVal; // bo.checkoutTime = abArray[k++].attrVal; bo.fromVersion = abArray[k++].attrVal; bos.put(bo.revisionid, bo); } return bos; } /** * 仅仅查询OID, REVISIONOID, NAMEOID * Map * key: * 最新版本最新版次:nameOId * 当前版本最新版次:revisonOId * 其他: OId * @param clauseList * @param sql * @return */ private Map executeSqlForBtmOIDS(String sql, int version){ Map bos = new HashMap(); Session session = HibernateSessionFactory.getSession(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); if(version == Version.currentRevLastVer){ for(int i = 0; i < list.size(); i++){ Object[] o = (Object[]) list.get(i); BusinessObject bo = new BusinessObject(); bo.oid = (String) o[0]; bo.revisionid = (String) o[1]; bo.nameoid = (String) o[2]; bos.put(bo.revisionid, bo); } }else if(version == Version.lastRevLastVer){ for(int i = 0; i < list.size(); i++){ Object[] o = (Object[]) list.get(i); BusinessObject bo = new BusinessObject(); bo.oid = (String) o[0]; bo.revisionid = (String) o[1]; bo.nameoid = (String) o[2]; bos.put(bo.nameoid, bo); } }else{ for(int i = 0; i < list.size(); i++){ Object[] o = (Object[]) list.get(i); BusinessObject bo = new BusinessObject(); bo.oid = (String) o[0]; bo.revisionid = (String) o[1]; bo.nameoid = (String) o[2]; bos.put(bo.oid, bo); } } return bos; } /** * Map * key: * 最新版本最新版次:nameOId * 当前版本最新版次:revisonOId * 其他: OId * @param clauseList * @param sql * @return */ public Map executeSqlForBtmOtherRV(List clauseList, String sql){ Map bos = new HashMap(); Session session = HibernateSessionFactory.getSession(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ BusinessObject bo = new BusinessObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 再判断Object // if((list.get(i)) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object obj_ = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); ab.attrName = abName; ab.attrVal = String.valueOf(obj_ == null ? "" : obj_); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj_ = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj_ == null ? "" : obj_); // abArray[0] = ab; // // } bo.newAttrValList = new AttributeValue[0]; bo.hisAttrValList = abArray; //为btm的系统属性赋值 int k = 0; bo.oid = abArray[k++].attrVal; bo.revisionid = abArray[k++].attrVal; bo.nameoid = abArray[k++].attrVal; bo.btName = abArray[k++].attrVal; bo.isLastR = Short.parseShort(abArray[k++].attrVal) != 0; bo.isFirstR = Short.parseShort(abArray[k++].attrVal) != 0; bo.isLastV = Short.parseShort(abArray[k++].attrVal) != 0; bo.isFirstV = Short.parseShort(abArray[k++].attrVal) != 0; bo.creator = abArray[k++].attrVal; bo.createTime = Integer.valueOf(abArray[k++].attrVal); bo.modifier = abArray[k++].attrVal; bo.modifyTime = Integer.valueOf(abArray[k++].attrVal); bo.revisionRule = abArray[k++].attrVal; bo.versionRule = abArray[k++].attrVal; bo.revisionSeq = Short.parseShort(abArray[k++].attrVal); bo.revisionValue = abArray[k++].attrVal; bo.versionSeq = Short.parseShort(abArray[k++].attrVal); bo.versionValue = abArray[k++].attrVal; bo.lctId = abArray[k++].attrVal; bo.lcStatus = abArray[k++].attrVal; bo.ts = Integer.valueOf(abArray[k++].attrVal); bo.id = abArray[k++].attrVal; bo.name = abArray[k++].attrVal; bo.description = abArray[k++].attrVal; bo.owner = abArray[k++].attrVal; // bo.checkinBy = abArray[k++].attrVal; // bo.checkinTime = abArray[k++].attrVal; // bo.checkoutBy = abArray[k++].attrVal; // bo.checkoutTime = abArray[k++].attrVal; bo.fromVersion = abArray[k++].attrVal; bos.put(bo.oid, bo); } return bos; } /** * 解析QueryTemplate 为sql * 执行sql, 返回结果 * @param queryTemplate * @return * @throws VCIError */ public List findLinkObject(QueryTemplate queryTemplate) throws Throwable{ List clauseList = queryTemplate.getClauseList(); String ltName = queryTemplate.getLinkType(); String ltTableName = OmdHelper.getLTTableName(ltName); String btmName = queryTemplate.getBtmType(); String btmTableName = OmdHelper.getBTTableName(btmName); boolean btmFlag = false; // if (clauseList.contains(ltTableName + ".*") || clauseList.contains("*")) { clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName); if(btmName != null && !btmName.equals("")){ btmFlag = true; clauseList.add(btmTableName + ".OID AS OID2"); clauseList.add(btmTableName + ".REVISIONOID AS REVISIONOID2"); } clauseList.add("CONNECT_BY_ISLEAF"); clauseList.add("LEVEL"); // } queryTemplate.setClauseList(clauseList); Parser parser = new Parser(queryTemplate); String sql = parser.parseToSql(); List objList = null; if(btmFlag){ objList = executeSqlForLink(clauseList, sql, queryTemplate.getDirection(), ltName); }else{ objList = executeSqlForLinkOnly(clauseList, sql, ltName); } return objList; } /** * 查询链接类型 * 通过连接业务类型表, 替换btmOId, btmRevisionOId * @param clauseList * @param sql * @param queryType * @param direction * @return * @throws VCIError */ public List executeSqlForLink(List clauseList, String sql, String direction, String ltName) throws VCIError{ try{ Session session = HibernateSessionFactory.getSession(); List objList = new ArrayList(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ LinkObject lo = new LinkObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 在判断Object // if(list.get(i) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object value = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); if(abName.contains(".")){ abName = abName.substring(abName.indexOf(".") + 1); //abName: CONNECT_BY_ISLEAF --> _ISLEAF }else if(abName.equals("CONNECT_BY_ISLEAF")){ abName = "_ISLEAF"; }else if(abName.equals("LEVEL")){ abName = "_LEVEL"; } //只查询链接时, 没有direction if(direction != null){ if(direction.equalsIgnoreCase(QTConstants.DIRECTION_POSITIVE)){ //正向查询(反向查询不用覆盖) //查询出的to端的btm对象的OID和REVISIONOID, //覆盖link对象中的t_OId 和 t_RevisionOId if(abName.toUpperCase().equals("OID AS OID2") && k > 0){ abName = "t_OId"; } if(abName.toUpperCase().equals("REVISIONOID AS REVISIONOID2") && k > 0){ abName = "t_RevisionOId"; } } } ab.attrName = abName; ab.attrVal = String.valueOf(value == null ? "" : value); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // if(abName.contains(".")){ // abName = abName.substring(abName.indexOf(".") + 1); // } //只查询链接时, 没有direction // if(direction != null){ // if(direction.equalsIgnoreCase(QTConstants.DIRECTION_POSITIVE)){ //正向查询(反向查询不用覆盖) //查询出的to端的btm对象的OID和REVISIONOID, //覆盖link对象中的t_OId 和 t_RevisionOId // if(abName.toUpperCase().equals("OID AS OID2")){ // abName = "t_OId"; // } // if(abName.toUpperCase().equals("REVISIONOID AS REVISIONOID2")){ // abName = "t_RevisionOId"; // } // } // } // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj == null ? "" : obj); // abArray[0] = ab; // } //为link的系统属性赋值 int k = 0; lo.oid = abArray[k++].attrVal; lo.creator = abArray[k++].attrVal; lo.createTime = Integer.valueOf(abArray[k++].attrVal); lo.modifier = abArray[k++].attrVal; lo.modifyTime = Integer.valueOf(abArray[k++].attrVal); lo.fromOid = abArray[k++].attrVal; lo.fromRevOid = abArray[k++].attrVal; lo.fromNameOid = abArray[k++].attrVal; lo.fromBTName = abArray[k++].attrVal; lo.toOid = abArray[k++].attrVal; lo.toRevOid = abArray[k++].attrVal; lo.toNameOid = abArray[k++].attrVal; lo.toBTName = abArray[k++].attrVal; lo.ts = Integer.valueOf(abArray[k++].attrVal); if(direction != null){ if(direction.equalsIgnoreCase(QTConstants.DIRECTION_OPPOSITE)){ //反向查询 //查询出的from端的btm对象的OID和REVISIONOID, //覆盖link对象中的f_OId 和 f_RevisionOId int flag = 0; for(int m = abArray.length - 2; m > k; m--){ AttributeValue ab = abArray[m]; if(ab.attrName.equalsIgnoreCase("F_REVISIONOID")){ lo.fromRevOid = abArray[m].attrVal; flag++; } if(ab.attrName.equalsIgnoreCase("F_OID")){ lo.fromOid = abArray[m].attrVal; flag++; } if(flag == 2){ break; } } }else if(direction.equalsIgnoreCase(QTConstants.DIRECTION_POSITIVE)){ //正向查询 //查询出的to端的btm对象的OID和REVISIONOID, //覆盖link对象中的t_OId 和 t_RevisionOId int flag = 0; for(int m = abArray.length - 2; m > k; m--){ AttributeValue ab = abArray[m]; if(ab.attrName.equalsIgnoreCase("T_REVISIONOID")){ lo.toRevOid = abArray[m].attrVal; flag++; } if(ab.attrName.equalsIgnoreCase("T_OID")){ lo.toOid = abArray[m].attrVal; flag++; } if(flag == 2){ break; } } } } lo.hisAttrValList = abArray; lo.newAttrValList = new AttributeValue[0]; //目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; objList.add(lo); } return objList; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 查询链接类型 * 只查询链接类型, 不需要替换btmOId, btmRevisionOId * @param clauseList * @param sql * @param queryType * @param direction * @param ltName : 目前系统属性没有ltName * @return * @throws VCIError */ public List executeSqlForLinkOnly(List clauseList, String sql, String ltName) throws VCIError{ try{ Session session = HibernateSessionFactory.getSession(); List objList = new ArrayList(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ LinkObject lo = new LinkObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 在判断Object // if(list.get(i) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object value = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); if(abName.contains(".")){ abName = abName.substring(abName.indexOf(".") + 1); //abName: CONNECT_BY_ISLEAF --> _ISLEAF }else if(abName.equals("CONNECT_BY_ISLEAF")){ abName = "_ISLEAF"; }else if(abName.equals("LEVEL")){ abName = "_LEVEL"; } ab.attrName = abName; ab.attrVal = String.valueOf(value == null ? "" : value); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // if(abName.contains(".")){ // abName = abName.substring(abName.indexOf(".") + 1); // } // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj == null ? "" : obj); // abArray[0] = ab; // } //为link的系统属性赋值 int k = 0; lo.oid = abArray[k++].attrVal; lo.creator = abArray[k++].attrVal; lo.createTime = Integer.valueOf(abArray[k++].attrVal); lo.modifier = abArray[k++].attrVal; lo.modifyTime = Integer.valueOf(abArray[k++].attrVal); lo.fromOid = abArray[k++].attrVal; lo.fromRevOid = abArray[k++].attrVal; lo.fromNameOid = abArray[k++].attrVal; lo.fromBTName = abArray[k++].attrVal; lo.toOid = abArray[k++].attrVal; lo.toRevOid = abArray[k++].attrVal; lo.toNameOid = abArray[k++].attrVal; lo.toBTName = abArray[k++].attrVal; lo.ts = Integer.valueOf(abArray[k++].attrVal); lo.hisAttrValList = abArray; lo.newAttrValList = new AttributeValue[0]; //目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; objList.add(lo); } return objList; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 查询链接类型 * 用Map替换btmOId, btmRevisionOId * 只有正向查询的Version.currentRevLastVer, Version.lastRevLastVer情况下调到 * @param clauseList * @param sql * @param queryType * @return * @throws VCIError */ public List executeSqlForLinkLRLV(List clauseList, String sql, Map bos, String ltName) throws VCIError{ try{ Session session = HibernateSessionFactory.getSession(); List objList = new ArrayList(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ LinkObject lo = new LinkObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 在判断Object // if(list.get(i) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object value = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); if(abName.contains(".")){ abName = abName.substring(abName.indexOf(".") + 1); //abName: CONNECT_BY_ISLEAF --> _ISLEAF }else if(abName.equals("CONNECT_BY_ISLEAF")){ abName = "_ISLEAF"; }else if(abName.equals("LEVEL")){ abName = "_LEVEL"; } ab.attrName = abName; ab.attrVal = String.valueOf(value == null ? "" : value); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // if(abName.contains(".")){ // abName = abName.substring(abName.indexOf(".") + 1); // } // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj == null ? "" : obj); // abArray[0] = ab; // } //为link的系统属性赋值 int k = 0; lo.oid = abArray[k++].attrVal; lo.creator = abArray[k++].attrVal; lo.createTime = Integer.valueOf(abArray[k++].attrVal); lo.modifier = abArray[k++].attrVal; lo.modifyTime = Integer.valueOf(abArray[k++].attrVal); lo.fromOid = abArray[k++].attrVal; lo.fromRevOid = abArray[k++].attrVal; lo.fromNameOid = abArray[k++].attrVal; lo.fromBTName = abArray[k++].attrVal; lo.toOid = abArray[k++].attrVal; lo.toRevOid = abArray[k++].attrVal; lo.toNameOid = abArray[k++].attrVal; lo.toBTName = abArray[k++].attrVal; lo.ts = Integer.valueOf(abArray[k++].attrVal); lo.hisAttrValList = abArray; lo.newAttrValList = new AttributeValue[0]; //目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; //lastRevLastVer BusinessObject bo = bos.get(lo.toNameOid); if(bo != null){ lo.toOid = bo.oid; lo.toRevOid = bo.revisionid; objList.add(lo); } } return objList; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 查询链接类型 * 用Map替换btmOId, btmRevisionOId * 只有正向查询的Version.currentRevLastVer, Version.lastRevLastVer情况下调到 * @param clauseList * @param sql * @param queryType * @return * @throws VCIError */ public List executeSqlForLinkCRLV(List clauseList, String sql, Map bos, String ltName) throws VCIError{ try{ Session session = HibernateSessionFactory.getSession(); List objList = new ArrayList(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ LinkObject lo = new LinkObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 在判断Object // if(list.get(i) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object value = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); if(abName.contains(".")){ abName = abName.substring(abName.indexOf(".") + 1); //abName: CONNECT_BY_ISLEAF --> _ISLEAF }else if(abName.equals("CONNECT_BY_ISLEAF")){ abName = "_ISLEAF"; }else if(abName.equals("LEVEL")){ abName = "_LEVEL"; } ab.attrName = abName; ab.attrVal = String.valueOf(value == null ? "" : value); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // if(abName.contains(".")){ // abName = abName.substring(abName.indexOf(".") + 1); // } // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj == null ? "" : obj); // abArray[0] = ab; // } //为link的系统属性赋值 int k = 0; lo.oid = abArray[k++].attrVal; lo.creator = abArray[k++].attrVal; lo.createTime = Integer.valueOf(abArray[k++].attrVal); lo.modifier = abArray[k++].attrVal; lo.modifyTime = Integer.valueOf(abArray[k++].attrVal); lo.fromOid = abArray[k++].attrVal; lo.fromRevOid = abArray[k++].attrVal; lo.fromNameOid = abArray[k++].attrVal; lo.fromBTName = abArray[k++].attrVal; lo.toOid = abArray[k++].attrVal; lo.toRevOid = abArray[k++].attrVal; lo.toNameOid = abArray[k++].attrVal; lo.toBTName = abArray[k++].attrVal; lo.ts = Integer.valueOf(abArray[k++].attrVal); lo.hisAttrValList = abArray; lo.newAttrValList = new AttributeValue[0]; //目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; //currentRevLastVer BusinessObject bo = bos.get(lo.toRevOid); if(bo != null){ lo.toOid = bo.oid; objList.add(lo); } } return objList; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 获取业务类型全部属性, 包括系统属性和属性池属性 * @param btmName * @return * @throws Throwable */ private List getAllAbNamesForBtm(String btmName) throws Throwable{ try{ List abList = new ArrayList(); String[] sysAbs = BusinessConstants.SELECT_CONSTANTS; for(int i = 0; i < sysAbs.length; i++){ abList.add(sysAbs[i]); } //String[] abs = ServerServiceProvider.getOMDService().getBTMService().getBtmApNameArray(btmName); String[] abs = OMCacheProvider.getBTAttributes(btmName); for(int i = 0; i < abs.length; i++){ abList.add(abs[i]); } return abList; }catch(Throwable e){ e.printStackTrace(); throw e; } } /** * 获取链接类型全部属性, 包括系统属性和属性池属性 * @param ltName * @return * @throws Throwable */ private List getAllAbNamesForLink(String ltName) throws Throwable{ try{ List abList = new ArrayList(); String[] sysAbs = LinkConstants.SELECT_CONSTANTS; for(int i = 0; i < sysAbs.length; i++){ abList.add(sysAbs[i]); } //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] abs = linkType.attributes; for(int i = 0; i < abs.length; i++){ abList.add(abs[i]); } return abList; }catch(Throwable e){ e.printStackTrace(); throw e; } } /** * 根据查询模板获取linkObject 和 关联的businessObject * @param qt * @return * @throws Throwable */ public List findBOAndLOList(QueryTemplate qt) throws Throwable { try{ List blList = new ArrayList(); List clauseList = qt.getClauseList(); String ltName = qt.getLinkType(); String ltTableName = OmdHelper.getLTTableName(ltName); String btmName = qt.getBtmType(); // if (clauseList.contains(ltTableName + ".*") || clauseList.contains("*")) { clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName); clauseList.add("CONNECT_BY_ISLEAF"); clauseList.add("LEVEL"); clauseList.addAll(getAllBtmFiledsWithAlias(btmName)); // } qt.setClauseList(clauseList); //查询结果 Parser p = new Parser(qt); String sql = p.parseToSql(); Session session = HibernateSessionFactory.getSession(); List list = session.createSQLQuery(sql).list(); //获取link和btm的全部属性 List ltAbNames = getAllAbNamesForLink(ltName); List btmAbNames = getAllAbNamesForBtm(btmName); //封装BOANDLO对象 for(int i = 0; i < list.size(); i++){ BOAndLO bl = new BOAndLO(); bl.btmName = btmName; bl.ltName = ltName; Object o = list.get(i); // if(o instanceof Object[]){ Object[] obj = (Object[])o; //取值封装LinkObject LinkObject lo = new LinkObject(); AttributeValue[] ltAbArray = new AttributeValue[ltAbNames.size() + 2]; for(int k = 0; k < ltAbNames.size(); k++){ AttributeValue ab = new AttributeValue(); ab.attrName = ltAbNames.get(k); Object value = obj[k]; ab.attrVal = String.valueOf(value == null ? "" : value); ltAbArray[k] = ab; } //_ISLEAF属性赋值 AttributeValue isleafAb = new AttributeValue(); isleafAb.attrName = "_ISLEAF"; Object isleafVal = obj[ltAbNames.size()]; isleafAb.attrVal = String.valueOf(isleafVal == null ? "" : isleafVal); ltAbArray[ltAbNames.size()] = isleafAb; //_LEVEL属性赋值 AttributeValue levelAb = new AttributeValue(); levelAb.attrName = "_LEVEL"; Object levelVal = obj[ltAbNames.size() + 1]; levelAb.attrVal = String.valueOf(levelVal == null ? "" : levelVal); ltAbArray[ltAbNames.size() + 1] = levelAb; //为link的系统属性赋值 int k_ = 0; lo.oid = ltAbArray[k_++].attrVal; lo.creator = ltAbArray[k_++].attrVal; lo.createTime = Integer.valueOf(ltAbArray[k_++].attrVal); lo.modifier = ltAbArray[k_++].attrVal; lo.modifyTime = Integer.valueOf(ltAbArray[k_++].attrVal); lo.fromOid = ltAbArray[k_++].attrVal; lo.fromRevOid = ltAbArray[k_++].attrVal; lo.fromNameOid = ltAbArray[k_++].attrVal; lo.fromBTName = ltAbArray[k_++].attrVal; lo.toOid = ltAbArray[k_++].attrVal; lo.toRevOid = ltAbArray[k_++].attrVal; lo.toNameOid = ltAbArray[k_++].attrVal; lo.toBTName = ltAbArray[k_++].attrVal; lo.ts = Integer.valueOf(ltAbArray[k_++].attrVal); lo.hisAttrValList = ltAbArray; lo.newAttrValList = new AttributeValue[0]; //目前系统属性没有ltName, 传参赋值 lo.ltName = ltName; bl.lo = lo; //取值封装btmObject BusinessObject bo = new BusinessObject(); AttributeValue[] btmAbArray = new AttributeValue[btmAbNames.size()]; int ltAblength = ltAbNames.size(); for(int k = 0; k < btmAbNames.size(); k++){ AttributeValue ab = new AttributeValue(); ab.attrName = btmAbNames.get(k); //+2为CONNECT_BY_ISLEAF, LEVEL Object value = obj[k + ltAblength + 2]; ab.attrVal = String.valueOf(value == null ? "" : value); btmAbArray[k] = ab; } //为Btm的系统属性赋值 bo.hisAttrValList = btmAbArray; bo.newAttrValList = new AttributeValue[0]; int k = 0; bo.oid = btmAbArray[k++].attrVal; bo.revisionid = btmAbArray[k++].attrVal; bo.nameoid = btmAbArray[k++].attrVal; bo.btName = btmAbArray[k++].attrVal; bo.modifyTime = Integer.valueOf(btmAbArray[k++].attrVal); bo.isFirstR = Short.parseShort(btmAbArray[k++].attrVal) != 0; bo.isLastV = Short.parseShort(btmAbArray[k++].attrVal) != 0; bo.isFirstV = Short.parseShort(btmAbArray[k++].attrVal) != 0; bo.creator = btmAbArray[k++].attrVal; bo.createTime = Integer.valueOf(btmAbArray[k++].attrVal); bo.modifier = btmAbArray[k++].attrVal; bo.modifyTime = Integer.valueOf(btmAbArray[k++].attrVal); bo.revisionRule = btmAbArray[k++].attrVal; bo.versionRule = btmAbArray[k++].attrVal; bo.revisionSeq = Short.parseShort(btmAbArray[k++].attrVal); bo.revisionValue = btmAbArray[k++].attrVal; bo.versionSeq = Short.parseShort(btmAbArray[k++].attrVal); bo.versionValue = btmAbArray[k++].attrVal; bo.lctId = btmAbArray[k++].attrVal; bo.lcStatus = btmAbArray[k++].attrVal; bo.ts = Integer.valueOf(btmAbArray[k++].attrVal); bo.id = btmAbArray[k++].attrVal; bo.name = btmAbArray[k++].attrVal; bo.description = btmAbArray[k++].attrVal; bo.owner = btmAbArray[k++].attrVal; // bo.checkinBy = btmAbArray[k++].attrVal; // bo.checkinTime = btmAbArray[k++].attrVal; // bo.checkoutBy = btmAbArray[k++].attrVal; // bo.checkoutTime = btmAbArray[k++].attrVal; bo.fromVersion = btmAbArray[k++].attrVal; bl.bo = bo; // }else{ //因为全部查询,不是单独列的查询 // } blList.add(bl); } return blList; }catch(Throwable e){ e.printStackTrace(); throw e; } } /** * 查询出链接对象, 根据版本版次条件拼接上业务对象 * @param clauseList * @param sql * @param queryType * @return * @throws VCIError */ public List findBOAndLOListLRLV(List clauseList, String sql, Map bos) throws VCIError{ try{ Session session = HibernateSessionFactory.getSession(); List objList = new ArrayList(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ LinkObject lo = new LinkObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 在判断Object // if(list.get(i) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object value = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); if(abName.contains(".")){ abName = abName.substring(abName.indexOf(".") + 1); //abName: CONNECT_BY_ISLEAF --> _ISLEAF }else if(abName.equals("CONNECT_BY_ISLEAF")){ abName = "_ISLEAF"; }else if(abName.equals("LEVEL")){ abName = "_LEVEL"; } ab.attrName = abName; ab.attrVal = String.valueOf(value == null ? "" : value); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // if(abName.contains(".")){ // abName = abName.substring(abName.indexOf(".") + 1); // } // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj == null ? "" : obj); // abArray[0] = ab; // } //为link的系统属性赋值 int k = 0; lo.oid = abArray[k++].attrVal; lo.creator = abArray[k++].attrVal; lo.createTime = Integer.valueOf(abArray[k++].attrVal); lo.modifier = abArray[k++].attrVal; lo.modifyTime = Integer.valueOf(abArray[k++].attrVal); lo.fromOid = abArray[k++].attrVal; lo.fromRevOid = abArray[k++].attrVal; lo.fromNameOid = abArray[k++].attrVal; lo.fromBTName = abArray[k++].attrVal; lo.toOid = abArray[k++].attrVal; lo.toRevOid = abArray[k++].attrVal; lo.toNameOid = abArray[k++].attrVal; lo.toBTName = abArray[k++].attrVal; lo.ts = Integer.valueOf(abArray[k++].attrVal); lo.hisAttrValList = abArray; lo.newAttrValList = new AttributeValue[0]; BusinessObject bo = bos.get(lo.toNameOid); if (bo != null) { BOAndLO obj = new BOAndLO(); obj.bo = bo; obj.btmName = bo.btName; obj.lo = lo; obj.ltName = lo.ltName; objList.add(obj); } } return objList; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 查询出链接对象, 根据版本版次条件拼接上业务对象 * @param clauseList * @param sql * @param queryType * @return * @throws VCIError */ public List findBOAndLOListCRLV(List clauseList, String sql, Map bos) throws VCIError{ try{ Session session = HibernateSessionFactory.getSession(); List objList = new ArrayList(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ LinkObject lo = new LinkObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 在判断Object // if(list.get(i) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object value = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); if(abName.contains(".")){ abName = abName.substring(abName.indexOf(".") + 1); //abName: CONNECT_BY_ISLEAF --> _ISLEAF }else if(abName.equals("CONNECT_BY_ISLEAF")){ abName = "_ISLEAF"; }else if(abName.equals("LEVEL")){ abName = "_LEVEL"; } ab.attrName = abName; ab.attrVal = String.valueOf(value == null ? "" : value); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // if(abName.contains(".")){ // abName = abName.substring(abName.indexOf(".") + 1); // } // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj == null ? "" : obj); // abArray[0] = ab; // } //为link的系统属性赋值 int k = 0; lo.oid = abArray[k++].attrVal; lo.creator = abArray[k++].attrVal; lo.createTime = Integer.valueOf(abArray[k++].attrVal); lo.modifier = abArray[k++].attrVal; lo.modifyTime = Integer.valueOf(abArray[k++].attrVal); lo.fromOid = abArray[k++].attrVal; lo.fromRevOid = abArray[k++].attrVal; lo.fromNameOid = abArray[k++].attrVal; lo.fromBTName = abArray[k++].attrVal; lo.toOid = abArray[k++].attrVal; lo.toRevOid = abArray[k++].attrVal; lo.toNameOid = abArray[k++].attrVal; lo.toBTName = abArray[k++].attrVal; lo.ts = Integer.valueOf(abArray[k++].attrVal); lo.hisAttrValList = abArray; lo.newAttrValList = new AttributeValue[0]; //currentRevLastVer BusinessObject bo = bos.get(lo.toRevOid); if (bo != null) { BOAndLO obj = new BOAndLO(); obj.bo = bo; obj.btmName = bo.btName; obj.lo = lo; obj.ltName = lo.ltName; objList.add(obj); } } return objList; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 查询出链接对象, 根据版本版次条件拼接上业务对象 * @param clauseList * @param sql * @param queryType * @return * @throws VCIError */ public List findBOAndLOListOpposite(List clauseList, String sql, Map bos) throws VCIError{ try{ Session session = HibernateSessionFactory.getSession(); List objList = new ArrayList(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ LinkObject lo = new LinkObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 在判断Object // if(list.get(i) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object value = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); if(abName.contains(".")){ abName = abName.substring(abName.indexOf(".") + 1); //abName: CONNECT_BY_ISLEAF --> _ISLEAF }else if(abName.equals("CONNECT_BY_ISLEAF")){ abName = "_ISLEAF"; }else if(abName.equals("LEVEL")){ abName = "_LEVEL"; } ab.attrName = abName; ab.attrVal = String.valueOf(value == null ? "" : value); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // if(abName.contains(".")){ // abName = abName.substring(abName.indexOf(".") + 1); // } // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj == null ? "" : obj); // abArray[0] = ab; // } //为link的系统属性赋值 int k = 0; lo.oid = abArray[k++].attrVal; lo.creator = abArray[k++].attrVal; lo.createTime = Integer.valueOf(abArray[k++].attrVal); lo.modifier = abArray[k++].attrVal; lo.modifyTime = Integer.valueOf(abArray[k++].attrVal); lo.fromOid = abArray[k++].attrVal; lo.fromRevOid = abArray[k++].attrVal; lo.fromNameOid = abArray[k++].attrVal; lo.fromBTName = abArray[k++].attrVal; lo.toOid = abArray[k++].attrVal; lo.toRevOid = abArray[k++].attrVal; lo.toNameOid = abArray[k++].attrVal; lo.toBTName = abArray[k++].attrVal; lo.ts = Integer.valueOf(abArray[k++].attrVal); lo.hisAttrValList = abArray; lo.newAttrValList = new AttributeValue[0]; BusinessObject bo = null; bo = bos.get(lo.fromOid); if (bo != null) { BOAndLO obj = new BOAndLO(); obj.bo = bo; obj.btmName = bo.btName; obj.lo = lo; obj.ltName = lo.ltName; objList.add(obj); } } return objList; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 查询出链接对象, 根据版本版次条件拼接上业务对象 * @param clauseList * @param sql * @param queryType * @return * @throws VCIError */ public List findBOAndLOListCRCV(List clauseList, String sql, Map bos) throws VCIError{ try{ Session session = HibernateSessionFactory.getSession(); List objList = new ArrayList(); SQLQuery sqlquery = session.createSQLQuery(sql); //根据查询模板中的查询列clauseList, 设置map List list = sqlquery.list(); for(int i = 0; i < list.size(); i++){ LinkObject lo = new LinkObject(); AttributeValue[] abArray = null; //当list.get(i)中有多个Object时, 类型为Object[] //必须先判断Object[] 在判断Object // if(list.get(i) instanceof Object[]){ Object[] objs = (Object[])list.get(i); abArray = new AttributeValue[clauseList.size()]; for(int k = 0; k < clauseList.size(); k++){ AttributeValue ab = new AttributeValue(); //sessin查询出的值 Object value = objs[k]; //clauseList中对应的查询列 String abName = clauseList.get(k); if(abName.contains(".")){ abName = abName.substring(abName.indexOf(".") + 1); //abName: CONNECT_BY_ISLEAF --> _ISLEAF }else if(abName.equals("CONNECT_BY_ISLEAF")){ abName = "_ISLEAF"; }else if(abName.equals("LEVEL")){ abName = "_LEVEL"; } ab.attrName = abName; ab.attrVal = String.valueOf(value == null ? "" : value); abArray[k] = ab; } //当list.get(i)中只有一个Object时, 类型为Object // }else{ //sessin查询出的值 // Object obj = list.get(i); //clauseList中对应的查询列 // String abName = clauseList.get(0); // if(abName.contains(".")){ // abName = abName.substring(abName.indexOf(".") + 1); // } // abArray = new AttributeValue[1]; // AttributeValue ab = new AttributeValue(); // ab.attrName = abName; // ab.attrVal = String.valueOf(obj == null ? "" : obj); // abArray[0] = ab; // } //为link的系统属性赋值 int k = 0; lo.oid = abArray[k++].attrVal; lo.creator = abArray[k++].attrVal; lo.createTime = Integer.valueOf(abArray[k++].attrVal); lo.modifier = abArray[k++].attrVal; lo.modifyTime = Integer.valueOf(abArray[k++].attrVal); lo.fromOid = abArray[k++].attrVal; lo.fromRevOid = abArray[k++].attrVal; lo.fromNameOid = abArray[k++].attrVal; lo.fromBTName = abArray[k++].attrVal; lo.toOid = abArray[k++].attrVal; lo.toRevOid = abArray[k++].attrVal; lo.toNameOid = abArray[k++].attrVal; lo.toBTName = abArray[k++].attrVal; lo.ts = Integer.valueOf(abArray[k++].attrVal); lo.hisAttrValList = abArray; lo.newAttrValList = new AttributeValue[0]; BusinessObject bo = null; bo = bos.get(lo.toOid); if (bo != null) { BOAndLO obj = new BOAndLO(); obj.bo = bo; obj.btmName = bo.btName; obj.lo = lo; obj.ltName = lo.ltName; objList.add(obj); } } return objList; }catch(Throwable e){ e.printStackTrace(); throw getLocalVciError("P0010QT-00009", e); } } /** * 将业务类型的全部属性加上别名返回,用作查询列。 * 解决Hiberbate的覆盖同名查询列的值的问题。 * btmTableName.abName as abName2 * 避免别名后标识符过长(超过30), oracle查询出错 * @param btmName * @return * @throws Throwable */ private List getAllBtmFiledsWithAlias(String btmName) throws Throwable { try{ List list = new ArrayList(); List abList = new ArrayList(); abList = getAllAbNamesForBtm(btmName); String btmTableName = OmdHelper.getBTTableName(btmName); for(int i = 0; i < abList.size(); i++){ String abName = abList.get(i).trim(); list.add(btmTableName + "." + abName + " AS " + abName + "2"); } return list; }catch(Throwable e){ throw e; } } /** * 将链接类型的全部属性加上表明返回, 用作查询列; * 避免与业务类型做链接查询时, 出现列明不明确问题. * tableName.ltName * @param ltName * @param tableName * @return * @throws Throwable */ private List getAllLinkTypeFiledsWithTableName(String ltName ,String tableName) throws Throwable{ try{ List abList = new ArrayList(); String[] sysAbs = LinkConstants.SELECT_CONSTANTS; for(int i = 0; i < sysAbs.length; i++){ abList.add(tableName + "." + sysAbs[i]); } //LinkType linkType = ServerServiceProvider.getOMDService().getLinkTypeService().getLinkType(ltName); LinkType linkType = OMCacheProvider.getLinkType(ltName); String[] abs = linkType.attributes; for(int i = 0; i < abs.length; i++){ abList.add(tableName + "." + abs[i].trim()); } return abList; }catch(Throwable e){ e.printStackTrace(); throw e; } } //**************************************分段策略来实现递归查询********************************************** public List findLinkObjectByPartion(QueryTemplate qt) throws Throwable{ List clauseList = qt.getClauseList(); String ltName = qt.getLinkType(); String ltTableName = OmdHelper.getLTTableName(ltName); clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName); clauseList.add("CONNECT_BY_ISLEAF"); clauseList.add("LEVEL"); qt.setClauseList(clauseList); Parser parser = new Parser(qt); String sql = parser.getLinkQuerySql(); List los = null; int version = qt.getVersion(); //Version.currentRevLastVer, Version.lastRevLastVer需要替换版本版次 los = executeSqlForLinkOnly(clauseList, sql, ltName); int recReturnMode = qt.getRecReturnMode(); //对查询结果进行过滤 if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){ los = filterLos(los); } if(version == Version.currentRevLastVer){ Map boMap = getBoOIDSByPartionCRLV(qt, los); return replaceLink(los, boMap, version); }else if(version == Version.lastRevLastVer){ Map boMap = getBoOIDSByPartionLRLV(qt, los); return replaceLink(los, boMap, version); //currentRevCurrentVer 虽不需要替换版本版次, 但有bo条件时需要用bo过滤lo }else{ //String btmConditionSql = qt.getCondition().getBtmConditionSql(qt, true); String btmConditionSql = QTSqlUtil.getBtmConditionSql(qt, true); if(btmConditionSql != null && !btmConditionSql.equals("")){ Map boMap = getBoOIDSByPartionOtherRV(qt, los, version); return replaceLink(los, boMap, version); }else{ return los; } } } /** * 按不同类型的revisionOid分组查询获取Map * 当同一个类型中的revisionOid数量大于PARTIONSIZE时, 按照PARTIONSIZE分批查询 * @return * @throws Throwable */ public Map getBosByPartionCRLV(QueryTemplate qt, List los) throws Throwable{ Map bos = new HashMap(); Map> map = new HashMap>(); LinkObject lo = null; // revisionOid按照类型分组 for (int i = 0; i < los.size(); i++) { lo = los.get(i); String key = lo.toBTName; String value = lo.toRevOid; List list = map.get(key); if (list == null) { list = new ArrayList(); map.put(key, list); } if (!list.contains(value)) { list.add(value); } } //按不同类型的revisionOid分组查询 for(Iterator ite = map.keySet().iterator(); ite.hasNext();){ String btmName = ite.next(); List revisionOidList = map.get(btmName); List clauseList = getAllAbNamesForBtm(btmName); qt.setClauseList(clauseList); qt.setBtmType(btmName); Parser parser = new Parser(qt); String sql_ = parser.getBtmQuerySql(); sql_ += " and REVISIONOID IN ("; int size = revisionOidList.size(); StringBuilder stb = null; for(int k = 0; k < size/PARTIONSIZE + 1; k++){ stb = new StringBuilder(sql_); for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){ stb.append("'"); stb.append(revisionOidList.get(m)); stb.append("'"); stb.append(","); } String sql = stb.substring(0, stb.lastIndexOf(",")) + ")"; bos.putAll(executeSqlForBtmCRLV(clauseList, sql)); } } return bos; } public Map getBosByPartionLRLV(QueryTemplate qt, List los) throws Throwable{ Map bos = new HashMap(); Map> map = new HashMap>(); LinkObject lo = null; // NameOid按照类型分组 for (int i = 0; i < los.size(); i++) { lo = los.get(i); String key = lo.toBTName; String value = lo.toNameOid; List list = map.get(key); if (list == null) { list = new ArrayList(); map.put(key, list); } if (!list.contains(value)) { list.add(value); } } //按不同类型的NameOid分组查询 for(Iterator ite = map.keySet().iterator(); ite.hasNext();){ String btmName = ite.next(); List nameOidList = map.get(btmName); List clauseList = getAllAbNamesForBtm(btmName); qt.setClauseList(clauseList); qt.setBtmType(btmName); Parser parser = new Parser(qt); String sql_ = parser.getBtmQuerySql(); sql_ += " and NAMEOID IN ("; int size = nameOidList.size(); StringBuilder stb = null; for(int k = 0; k < size/PARTIONSIZE + 1; k++){ stb = new StringBuilder(sql_); for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){ stb.append("'"); stb.append(nameOidList.get(m)); stb.append("'"); stb.append(","); } String sql = stb.substring(0, stb.lastIndexOf(",")) + ")"; bos.putAll(executeSqlForBtmLRLV(clauseList, sql)); } } return bos; } public Map getBosByPartionOtherRV(QueryTemplate qt, List los, int version) throws Throwable{ Map bos = new HashMap(); Map> map = new HashMap>(); LinkObject lo = null; // Oid按照类型分组 if(version == Version.currentRevCurrentVer){ for (int i = 0; i < los.size(); i++) { lo = los.get(i); String key = lo.toBTName; String value = lo.toOid; List list = map.get(key); if (list == null) { list = new ArrayList(); map.put(key, list); } if (!list.contains(value)) { list.add(value); } } }else{ for (int i = 0; i < los.size(); i++) { lo = los.get(i); String key = lo.fromBTName; String value = lo.fromOid; List list = map.get(key); if (list == null) { list = new ArrayList(); map.put(key, list); } if (!list.contains(value)) { list.add(value); } } } //按不同类型的Oid分组查询 for(Iterator ite = map.keySet().iterator(); ite.hasNext();){ String btmName = ite.next(); List nameOidList = map.get(btmName); List clauseList = getAllAbNamesForBtm(btmName); qt.setClauseList(clauseList); qt.setBtmType(btmName); Parser parser = new Parser(qt); String sql_ = parser.getBtmQuerySql(); sql_ += " and OID IN ("; int size = nameOidList.size(); StringBuilder stb = null; for(int k = 0; k < size/PARTIONSIZE + 1; k++){ stb = new StringBuilder(sql_); for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){ stb.append("'"); stb.append(nameOidList.get(m)); stb.append("'"); stb.append(","); } String sql = stb.substring(0, stb.lastIndexOf(",")) + ")"; bos.putAll(executeSqlForBtmOtherRV(clauseList, sql)); } } return bos; } /** * 按不同类型的revisionOid分组查询获取Map * 当同一个类型中的revisionOid数量大于PARTIONSIZE时, 按照PARTIONSIZE分批查询 * @return * @throws Throwable */ public Map getBoOIDSByPartionCRLV(QueryTemplate qt, List los) throws Throwable{ Map bos = new HashMap(); Map> map = new HashMap>(); LinkObject lo = null; // revisionOid按照类型分组 for (int i = 0; i < los.size(); i++) { lo = los.get(i); String key = lo.toBTName; String value = lo.toRevOid; List list = map.get(key); if (list == null) { list = new ArrayList(); map.put(key, list); } if (!list.contains(value)) { list.add(value); } } //按不同类型的revisionOid分组查询 for(Iterator ite = map.keySet().iterator(); ite.hasNext();){ String btmName = ite.next(); List revisionOidList = map.get(btmName); List clauseList = new ArrayList(); clauseList.add("OID"); clauseList.add("REVISIONOID"); clauseList.add("NAMEOID"); qt.setClauseList(clauseList); qt.setBtmType(btmName); Parser parser = new Parser(qt); String sql_ = parser.getBtmQuerySql(); sql_ += " and REVISIONOID IN ("; int size = revisionOidList.size(); StringBuilder stb = null; for(int k = 0; k < size/PARTIONSIZE + 1; k++){ stb = new StringBuilder(sql_); for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){ stb.append("'"); stb.append(revisionOidList.get(m)); stb.append("'"); stb.append(","); } String sql = stb.substring(0, stb.lastIndexOf(",")) + ")"; bos.putAll(executeSqlForBtmOIDS(sql, Version.currentRevLastVer)); } } return bos; } public Map getBoOIDSByPartionLRLV(QueryTemplate qt, List los) throws Throwable{ Map bos = new HashMap(); Map> map = new HashMap>(); LinkObject lo = null; // nameOid按照类型分组 for (int i = 0; i < los.size(); i++) { lo = los.get(i); String key = lo.toBTName; String value = lo.toNameOid; List list = map.get(key); if (list == null) { list = new ArrayList(); map.put(key, list); } if (!list.contains(value)) { list.add(value); } } //按不同类型的revisionOid分组查询 for(Iterator ite = map.keySet().iterator(); ite.hasNext();){ String btmName = ite.next(); List revisionOidList = map.get(btmName); List clauseList = new ArrayList(); clauseList.add("OID"); clauseList.add("REVISIONOID"); clauseList.add("NAMEOID"); qt.setClauseList(clauseList); qt.setBtmType(btmName); Parser parser = new Parser(qt); String sql_ = parser.getBtmQuerySql(); sql_ += " and NAMEOID IN ("; int size = revisionOidList.size(); StringBuilder stb = null; for(int k = 0; k < size/PARTIONSIZE + 1; k++){ stb = new StringBuilder(sql_); for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){ stb.append("'"); stb.append(revisionOidList.get(m)); stb.append("'"); stb.append(","); } String sql = stb.substring(0, stb.lastIndexOf(",")) + ")"; bos.putAll(executeSqlForBtmOIDS(sql, Version.lastRevLastVer)); } } return bos; } public Map getBoOIDSByPartionOtherRV(QueryTemplate qt, List los, int version) throws Throwable{ Map bos = new HashMap(); Map> map = new HashMap>(); LinkObject lo = null; // Oid按照类型分组 if(version == Version.currentRevCurrentVer){ for (int i = 0; i < los.size(); i++) { lo = los.get(i); String key = lo.toBTName; String value = lo.toOid; List list = map.get(key); if (list == null) { list = new ArrayList(); map.put(key, list); } if (!list.contains(value)) { list.add(value); } } }else{ for (int i = 0; i < los.size(); i++) { lo = los.get(i); String key = lo.fromBTName; String value = lo.fromOid; List list = map.get(key); if (list == null) { list = new ArrayList(); map.put(key, list); } if (!list.contains(value)) { list.add(value); } } } //按不同类型的Oid分组查询 for(Iterator ite = map.keySet().iterator(); ite.hasNext();){ String btmName = ite.next(); List revisionOidList = map.get(btmName); List clauseList = new ArrayList(); clauseList.add("OID"); clauseList.add("REVISIONOID"); clauseList.add("NAMEOID"); qt.setClauseList(clauseList); qt.setBtmType(btmName); Parser parser = new Parser(qt); String sql_ = parser.getBtmQuerySql(); sql_ += " and OID IN ("; int size = revisionOidList.size(); StringBuilder stb = null; for(int k = 0; k < size/PARTIONSIZE + 1; k++){ stb = new StringBuilder(sql_); for(int m = k * PARTIONSIZE; m < (k + 1) * PARTIONSIZE && m < size; m++){ stb.append("'"); stb.append(revisionOidList.get(m)); stb.append("'"); stb.append(","); } String sql = stb.substring(0, stb.lastIndexOf(",")) + ")"; bos.putAll(executeSqlForBtmOIDS(sql, version)); } } return bos; } /** * 根据版本版次信息, 替换link的t_oid, t_RevisionOid * 过滤lo * @param los * @param boMap * @return */ private List replaceLink(List los, Map boMap, int version) { List los_ = new ArrayList(); if(version == Version.currentRevLastVer){ for(int i = 0; i < los.size(); i++){ LinkObject lo = los.get(i); BusinessObject bo = boMap.get(lo.toRevOid); if(bo != null){ lo.toOid = bo.oid; los_.add(lo); } } }else if(version == Version.lastRevLastVer){ for(int i = 0; i < los.size(); i++){ LinkObject lo = los.get(i); BusinessObject bo = boMap.get(lo.toNameOid); if(bo != null){ lo.toOid = bo.oid; lo.toRevOid = bo.revisionid; los_.add(lo); } } }else if(version == Version.currentRevCurrentVer){ for(int i = 0; i < los.size(); i++){ LinkObject lo = los.get(i); BusinessObject bo = boMap.get(lo.toOid); if(bo != null){ los_.add(lo); } } //反向 }else{ for(int i = 0; i < los.size(); i++){ LinkObject lo = los.get(i); BusinessObject bo = boMap.get(lo.fromOid); if(bo != null){ los_.add(lo); } } } return los_; } public List findBOAndLOByPartion(QueryTemplate qt) throws Throwable{ List clauseList = qt.getClauseList(); String ltName = qt.getLinkType(); String ltTableName = OmdHelper.getLTTableName(ltName); clauseList = getAllLinkTypeFiledsWithTableName(ltName, ltTableName); clauseList.add("CONNECT_BY_ISLEAF"); clauseList.add("LEVEL"); qt.setClauseList(clauseList); Parser parser = new Parser(qt); String sql = parser.getLinkQuerySql(); List los = executeSqlForLinkOnly(clauseList, sql, ltName); int recReturnMode = qt.getRecReturnMode(); //对查询结果进行过滤 if(recReturnMode == QTConstants.RECRETURNMODE_FILTER){ los = filterLos(los); } int version = qt.getVersion(); //查询业务对象 ---end--- if(version == Version.lastRevLastVer){ // los = findBOAndLOListLRLV(clauseList, sql, bos); Map boMap = getBosByPartionLRLV(qt, los); return combinationBOAndLO(los, boMap, version); }else if(version == Version.currentRevLastVer){ Map boMap = getBosByPartionCRLV(qt, los); return combinationBOAndLO(los, boMap, version); }else{ // los = findBOAndLOListOpposite(clauseList, sql, bos); Map boMap = getBosByPartionOtherRV(qt, los, version); return combinationBOAndLO(los, boMap, version); } } private List combinationBOAndLO(List los, Map boMap, int version) { List list = new ArrayList(); if(version == Version.currentRevLastVer){ for(int i = 0; i < los.size(); i++){ LinkObject lo = los.get(i); BusinessObject bo = boMap.get(lo.toRevOid); if(bo != null){ BOAndLO obj = new BOAndLO(); obj.bo = bo; obj.btmName = bo.btName; obj.lo = lo; obj.ltName = lo.ltName; list.add(obj); } } }else if(version == Version.lastRevLastVer){ for(int i = 0; i < los.size(); i++){ LinkObject lo = los.get(i); BusinessObject bo = boMap.get(lo.toNameOid); if(bo != null){ BOAndLO obj = new BOAndLO(); obj.bo = bo; obj.btmName = bo.btName; obj.lo = lo; obj.ltName = lo.ltName; list.add(obj); } } }else if(version == Version.currentRevCurrentVer){ for(int i = 0; i < los.size(); i++){ LinkObject lo = los.get(i); BusinessObject bo = boMap.get(lo.toOid); if(bo != null){ BOAndLO obj = new BOAndLO(); obj.bo = bo; obj.btmName = bo.btName; obj.lo = lo; obj.ltName = lo.ltName; list.add(obj); } } }else{ for(int i = 0; i < los.size(); i++){ LinkObject lo = los.get(i); BusinessObject bo = boMap.get(lo.fromOid); if(bo != null){ BOAndLO obj = new BOAndLO(); obj.bo = bo; obj.btmName = bo.btName; obj.lo = lo; obj.ltName = lo.ltName; list.add(obj); } } } return list; } /** * 对查询结果进行过滤 * @param los */ public List filterLos(List los) { List list = new ArrayList(); Map map = new HashMap(); for(LinkObject lo : los){ if(!map.containsKey(lo.oid)){ list.add(lo); map.put(lo.oid, lo.oid); } } return list; } /** * 对查询结果进行过滤 * @param list * @return */ public List filterLoAndBOs(List loAndBos) { List list = new ArrayList(); Map map = new HashMap(); for(BOAndLO loAndBo : loAndBos){ if(!map.containsKey(loAndBo.lo.oid)){ list.add(loAndBo); map.put(loAndBo.lo.oid, loAndBo.lo.oid); } } return list; } }