package com.amarsoft.aims.util; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.amarsoft.are.ARE; import com.amarsoft.are.jbo.BizObject; import com.amarsoft.are.jbo.BizObjectManager; import com.amarsoft.are.jbo.BizObjectQuery; import com.amarsoft.are.jbo.JBOException; import com.amarsoft.are.jbo.JBOFactory; import com.amarsoft.are.jbo.JBOTransaction; import com.amarsoft.are.lang.DataElement; /** * JBO工具类 * @author syang * @date 2013/11/18 */ public class JBOHelper { private static Pattern SQL_WHERE_PATTERN = Pattern.compile("\\w+=:(\\w+)",Pattern.CASE_INSENSITIVE); /** * 查找单个对象 * @param tx 事务对象 * @param needUpdate 查出来的对象是否需要更新 * @param jboClass JBO类名 * @param whereClause where条件 * @param values 参数值列表 * @return */ public static BizObject querySingle(JBOTransaction tx,boolean needUpdate,String jboClass,String whereClause,Object... values){ BizObject bizObject = null; try { BizObjectQuery query = genQuery(tx,jboClass,whereClause,values); bizObject = query.getSingleResult(needUpdate); } catch (JBOException e) { ARE.getLog().error(MessageFormat.format("在JBO类[{0}]上查找JBO对象出错,查询条件[{1}]", jboClass,whereClause),e); } return bizObject; } /** * 查找单个对象(不需要事务,查出来的对象可以被更新) * @param jboClass JBO类名 * @param whereClause where条件 * @param values 参数值列表 * @return */ public static BizObject querySingle(String jboClass,String whereClause,Object... values){ return querySingle(null,true,jboClass,whereClause,values); } /** * 创建JBO新对象 * @param tx * @param jboClass * @return */ public static BizObject createBizObject(JBOTransaction tx,String jboClass){ BizObjectManager bm; BizObject bo = null; try { bm = JBOFactory.getBizObjectManager(jboClass); if(tx!=null)tx.join(bm); bo = bm.newObject(); } catch (JBOException e) { ARE.getLog().error(MessageFormat.format("在JBO类[{0}]上创建BO对象出错", jboClass),e); } return bo; } /** * 创建JBO新对象 * @param tx * @param jboClass * @return */ public static BizObject createBizObject(String jboClass){ return createBizObject(null,jboClass); } /** * 保存JBO对象 * @param tx * @param jboClass * @param bo * @return */ public static BizObject saveBizObject(JBOTransaction tx,String jboClass,BizObject bo){ BizObjectManager bm; try { bm = JBOFactory.getBizObjectManager(jboClass); if(tx!=null)tx.join(bm); bm.saveObject(bo); } catch (JBOException e) { ARE.getLog().error(MessageFormat.format("在JBO类[{0}]上创建BO对象出错", jboClass),e); } return bo; } /** * 保存JBO对象 * @param jboClass * @param bo * @return */ public static BizObject saveBizObject(String jboClass,BizObject bo){ return saveBizObject(null,jboClass,bo); } /** * 查询一个JBO列表 * @param tx 事务对象 * @param needUpdate 查出来的对象是否需要更新 * @param jboClass JBO类名 * @param whereClause where条件 * @param values 参数值列表 * @return */ @SuppressWarnings("unchecked") public static List queryList(JBOTransaction tx,boolean needUpdate,String jboClass,String whereClause,Object... values){ List jboList = null; try { BizObjectQuery query = genQuery(tx,jboClass,whereClause,values); jboList = query.getResultList(needUpdate); } catch (JBOException e) { ARE.getLog().error(MessageFormat.format("在JBO类[{0}]上查找JBO对象出错,查询条件[{1}]", jboClass,whereClause),e); } return jboList; } /** * 查询一个JBO列表(不需要事务,查出来的对象可以被更新) * @param jboClass JBO类名 * @param whereClause where条件 * @param values 参数值列表 * @return */ public static List queryList(String jboClass,String whereClause,Object... values){ return queryList(null,true,jboClass,whereClause,values); } /** * 从JBO的SQL where子语句中解析出参数 * @param paraNames * @param s */ private static void parseParameterNames(List paraNames,String s){ Matcher matcher = SQL_WHERE_PATTERN.matcher(s); if(matcher.find()&&matcher.groupCount()>0){ String name = matcher.group(1); paraNames.add(name); parseParameterNames(paraNames,matcher.replaceFirst("")); } } /** * 生成查询条件 * @param tx 事务对象 * @param jboClass JBO类名 * @param whereClause where条件 * @param values 参数值列表 * @return * @throws JBOException */ private static BizObjectQuery genQuery(JBOTransaction tx,String jboClass,String whereClause,Object... values) throws JBOException{ BizObjectManager manager = JBOFactory.getBizObjectManager(jboClass); if(tx!=null)tx.join(manager); BizObjectQuery query = manager.createQuery(whereClause); List paraNames = new ArrayList(); parseParameterNames(paraNames,whereClause); for(int i=0;i