فهرست منبع

mulitThreaded=true

o2null 5 سال پیش
والد
کامیت
7a3fd5f715

+ 2 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/container/factory/PersistenceXmlHelper.java

@@ -282,8 +282,8 @@ public class PersistenceXmlHelper {
 		properties.put("openjpa.QueryCompilationCache", "false");
 		properties.put("openjpa.LockManager", "none");
 		properties.put("openjpa.jdbc.ResultSetType", "scroll-insensitive");
-		//使用false,使用ture支持多线程访问,但是是通过lock同步执行的.
-		properties.put("openjpa.Multithreaded", "false");
+		// 使用ture支持多线程访问,但是是通过lock同步执行的.
+		properties.put("openjpa.Multithreaded", "true");
 		/* 如果启用本地初始化会导致classLoad的问题 */
 		properties.put("openjpa.DynamicEnhancementAgent", "false");
 		properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=false)");

+ 81 - 83
o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/ActionExecute.java

@@ -1,6 +1,6 @@
 package com.x.query.assemble.surface.jaxrs.statement;
 
-import java.util.Objects;
+import java.util.Optional;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Parameter;
@@ -10,14 +10,16 @@ import javax.script.CompiledScript;
 import javax.script.ScriptContext;
 import javax.script.SimpleScriptContext;
 
-import com.x.base.core.entity.dynamic.DynamicBaseEntity;
 import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.dynamic.DynamicBaseEntity;
 import com.x.base.core.entity.dynamic.DynamicEntity;
+import com.x.base.core.project.cache.Cache.CacheKey;
+import com.x.base.core.project.cache.CacheManager;
 import com.x.base.core.project.exception.ExceptionAccessDenied;
 import com.x.base.core.project.exception.ExceptionEntityNotExist;
 import com.x.base.core.project.http.ActionResult;
@@ -31,54 +33,50 @@ import com.x.query.assemble.surface.ThisApplication;
 import com.x.query.core.entity.schema.Statement;
 import com.x.query.core.entity.schema.Table;
 import com.x.query.core.express.statement.Runtime;
-import com.x.base.core.project.cache.Cache.CacheKey;
-import com.x.base.core.project.cache.CacheManager;
-import java.util.Optional;
 
 class ActionExecute extends BaseAction {
 
 	ActionResult<Object> execute(EffectivePerson effectivePerson, String flag, Integer page, Integer size,
 			JsonElement jsonElement) throws Exception {
 
+		ActionResult<Object> result = new ActionResult<>();
+		Statement statement = this.getStatement(flag);
+		if (null == statement) {
+			throw new ExceptionEntityNotExist(flag, Statement.class);
+		}
+
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Object> result = new ActionResult<>();
 			Business business = new Business(emc);
-			Statement statement = this.getStatement(business, flag);
-			if (null == statement) {
-				throw new ExceptionEntityNotExist(flag, Statement.class);
-			}
-
 			if (!business.executable(effectivePerson, statement)) {
 				throw new ExceptionAccessDenied(effectivePerson, statement);
 			}
+		}
 
-			Runtime runtime = this.runtime(effectivePerson, jsonElement, business, page, size);
+		Runtime runtime = this.runtime(effectivePerson, jsonElement, page, size);
 
-			Object data = null;
+		Object data = null;
 
-			switch (Objects.toString(statement.getFormat(), "")) {
-				case Statement.FORMAT_SCRIPT:
-					data = this.script(effectivePerson, business, statement, runtime);
-					break;
-				default:
-					data = this.jpql(effectivePerson, business, statement, runtime);
-					break;
-			}
-			result.setData(data);
-			return result;
+		if (StringUtils.equals(statement.getFormat(), Statement.FORMAT_SCRIPT)) {
+			data = this.script(effectivePerson, statement, runtime);
+		} else {
+			data = this.jpql(effectivePerson, statement, runtime);
 		}
+		result.setData(data);
+		return result;
 	}
 
-	private Statement getStatement(Business business, String flag) throws Exception {
+	private Statement getStatement(String flag) throws Exception {
 		Statement statement = null;
 		CacheKey cacheKey = new CacheKey(this.getClass(), flag);
 		Optional<?> optional = CacheManager.get(cache, cacheKey);
 		if (optional.isPresent()) {
 			statement = (Statement) optional.get();
 		} else {
-			statement = business.entityManagerContainer().flag(flag, Statement.class);
-			if (null != statement) {
-				CacheManager.put(cache, cacheKey, statement);
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				statement = emc.flag(flag, Statement.class);
+				if (null != statement) {
+					CacheManager.put(cache, cacheKey, statement);
+				}
 			}
 		}
 		return statement;
@@ -86,8 +84,7 @@ class ActionExecute extends BaseAction {
 
 	private CompiledScript getCompiledScriptOfScriptText(Statement statement) throws Exception {
 		CompiledScript compiledScript = null;
-		CacheKey cacheKey = new CacheKey(this.getClass(), statement.getId(),
-				Statement.scriptText_FIELDNAME);
+		CacheKey cacheKey = new CacheKey(this.getClass(), statement.getId(), Statement.scriptText_FIELDNAME);
 		Optional<?> optional = CacheManager.get(cache, cacheKey);
 		if (optional.isPresent()) {
 			compiledScript = (CompiledScript) optional.get();
@@ -98,69 +95,70 @@ class ActionExecute extends BaseAction {
 		return compiledScript;
 	}
 
-	private Object script(EffectivePerson effectivePerson, Business business, Statement statement, Runtime runtime)
-			throws Exception {
+	private Object script(EffectivePerson effectivePerson, Statement statement, Runtime runtime) throws Exception {
 		Object data = null;
-
-		ScriptContext scriptContext = this.scriptContext(effectivePerson, business, runtime);
-
-		ScriptFactory.initialServiceScriptText().eval(scriptContext);
-
-		CompiledScript compiledScript = this.getCompiledScriptOfScriptText(statement);
-		Object o = compiledScript.eval(scriptContext);
-		String text = ScriptFactory.asString(o);
-		Class<? extends JpaObject> cls = this.clazz(business, statement);
-		EntityManager em;
-		if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
-				&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
-			em = business.entityManagerContainer().get(DynamicBaseEntity.class);
-		}else{
-			em = business.entityManagerContainer().get(cls);
-		}
-		Query query = em.createQuery(text);
-		for (Parameter<?> p : query.getParameters()) {
-			if (runtime.hasParameter(p.getName())) {
-				query.setParameter(p.getName(), runtime.getParameter(p.getName()));
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			ScriptContext scriptContext = this.scriptContext(effectivePerson, business, runtime);
+			ScriptFactory.initialServiceScriptText().eval(scriptContext);
+			CompiledScript compiledScript = this.getCompiledScriptOfScriptText(statement);
+			Object o = compiledScript.eval(scriptContext);
+			String text = ScriptFactory.asString(o);
+			Class<? extends JpaObject> cls = this.clazz(business, statement);
+			EntityManager em;
+			if (StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
+					&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
+				em = business.entityManagerContainer().get(DynamicBaseEntity.class);
+			} else {
+				em = business.entityManagerContainer().get(cls);
+			}
+			Query query = em.createQuery(text);
+			for (Parameter<?> p : query.getParameters()) {
+				if (runtime.hasParameter(p.getName())) {
+					query.setParameter(p.getName(), runtime.getParameter(p.getName()));
+				}
+			}
+			if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
+				query.setFirstResult((runtime.page - 1) * runtime.size);
+				query.setMaxResults(runtime.size);
+				data = query.getResultList();
+			} else {
+				business.entityManagerContainer().beginTransaction(cls);
+				data = query.executeUpdate();
+				business.entityManagerContainer().commit();
 			}
-		}
-		if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
-			query.setFirstResult((runtime.page - 1) * runtime.size);
-			query.setMaxResults(runtime.size);
-			data = query.getResultList();
-		} else {
-			business.entityManagerContainer().beginTransaction(cls);
-			data = query.executeUpdate();
-			business.entityManagerContainer().commit();
 		}
 		return data;
 	}
 
-	private Object jpql(EffectivePerson effectivePerson, Business business, Statement statement, Runtime runtime)
-			throws Exception {
+	private Object jpql(EffectivePerson effectivePerson, Statement statement, Runtime runtime) throws Exception {
 		Object data = null;
-		Class<? extends JpaObject> cls = this.clazz(business, statement);
-		EntityManager em;
-		if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
-				&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
-			em = business.entityManagerContainer().get(DynamicBaseEntity.class);
-		}else{
-			em = business.entityManagerContainer().get(cls);
-		}
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Class<? extends JpaObject> cls = this.clazz(business, statement);
+			EntityManager em;
+			if (StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
+					&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
+				em = business.entityManagerContainer().get(DynamicBaseEntity.class);
+			} else {
+				em = business.entityManagerContainer().get(cls);
+			}
 
-		Query query = em.createQuery(statement.getData());
-		for (Parameter<?> p : query.getParameters()) {
-			if (runtime.hasParameter(p.getName())) {
-				query.setParameter(p.getName(), runtime.getParameter(p.getName()));
+			Query query = em.createQuery(statement.getData());
+			for (Parameter<?> p : query.getParameters()) {
+				if (runtime.hasParameter(p.getName())) {
+					query.setParameter(p.getName(), runtime.getParameter(p.getName()));
+				}
+			}
+			if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
+				query.setFirstResult((runtime.page - 1) * runtime.size);
+				query.setMaxResults(runtime.size);
+				data = query.getResultList();
+			} else {
+				business.entityManagerContainer().beginTransaction(cls);
+				data = query.executeUpdate();
+				business.entityManagerContainer().commit();
 			}
-		}
-		if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
-			query.setFirstResult((runtime.page - 1) * runtime.size);
-			query.setMaxResults(runtime.size);
-			data = query.getResultList();
-		} else {
-			business.entityManagerContainer().beginTransaction(cls);
-			data = query.executeUpdate();
-			business.entityManagerContainer().commit();
 		}
 		return data;
 	}

+ 150 - 145
o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/ActionExecuteV2.java

@@ -43,161 +43,166 @@ import java.util.regex.Pattern;
 class ActionExecuteV2 extends BaseAction {
 
 	private static Logger logger = LoggerFactory.getLogger(ActionExecuteV2.class);
-	private final static String[] keys = {"group by","GROUP BY","order by","ORDER BY","limit","LIMIT"};
+	private final static String[] keys = { "group by", "GROUP BY", "order by", "ORDER BY", "limit", "LIMIT" };
 	private final static String JOIN_KEY = " JOIN ";
 	private final static String JOIN_ON_KEY = " ON ";
 
 	ActionResult<Object> execute(EffectivePerson effectivePerson, String flag, String mode, Integer page, Integer size,
 			JsonElement jsonElement) throws Exception {
-
+		Statement statement = null;
+		ActionResult<Object> result = new ActionResult<>();
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			ActionResult<Object> result = new ActionResult<>();
 			Business business = new Business(emc);
-			Statement statement = emc.flag(flag, Statement.class);
+			statement = emc.flag(flag, Statement.class);
 			if (null == statement) {
 				throw new ExceptionEntityNotExist(flag, Statement.class);
 			}
 			if (!business.executable(effectivePerson, statement)) {
 				throw new ExceptionAccessDenied(effectivePerson, statement);
 			}
-			Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
-			Runtime runtime = this.runtime(effectivePerson, wi.getParameter(), business, page, size);
+		}
+		Wi wi = this.convertToWrapIn(jsonElement, Wi.class);
+		Runtime runtime = this.runtime(effectivePerson, wi.getParameter(), page, size);
 
-			Object data = null;
-			Object count = null;
-			switch (mode){
-				case Statement.MODE_DATA:
-					switch (Objects.toString(statement.getFormat(), "")) {
-						case Statement.FORMAT_SCRIPT:
-							data = this.script(effectivePerson, business, statement, runtime, mode, wi);
-							break;
-						default:
-							data = this.jpql(effectivePerson, business, statement, runtime, mode, wi);
-							break;
-					}
-					result.setData(data);
-					break;
-				case Statement.MODE_COUNT:
-					switch (Objects.toString(statement.getFormat(), "")) {
-						case Statement.FORMAT_SCRIPT:
-							count = this.script(effectivePerson, business, statement, runtime, mode, wi);
-							break;
-						default:
-							count = this.jpql(effectivePerson, business, statement, runtime, mode, wi);
-							break;
-					}
-					result.setData(count);
-					result.setCount((Long)count);
-					break;
-				default:
-					switch (Objects.toString(statement.getFormat(), "")) {
-						case Statement.FORMAT_SCRIPT:
-							data = this.script(effectivePerson, business, statement, runtime, Statement.MODE_DATA, wi);
-							count = this.script(effectivePerson, business, statement, runtime, Statement.MODE_COUNT, wi);
-							break;
-						default:
-							data = this.jpql(effectivePerson, business, statement, runtime, Statement.MODE_DATA, wi);
-							count = this.jpql(effectivePerson, business, statement, runtime, Statement.MODE_COUNT, wi);
-							break;
-					}
-					result.setData(data);
-					result.setCount((Long)count);
+		Object data = null;
+		Object count = null;
+		switch (mode) {
+		case Statement.MODE_DATA:
+			switch (Objects.toString(statement.getFormat(), "")) {
+			case Statement.FORMAT_SCRIPT:
+				data = this.script(effectivePerson, statement, runtime, mode, wi);
+				break;
+			default:
+				data = this.jpql(effectivePerson, statement, runtime, mode, wi);
+				break;
+			}
+			result.setData(data);
+			break;
+		case Statement.MODE_COUNT:
+			switch (Objects.toString(statement.getFormat(), "")) {
+			case Statement.FORMAT_SCRIPT:
+				count = this.script(effectivePerson, statement, runtime, mode, wi);
+				break;
+			default:
+				count = this.jpql(effectivePerson, statement, runtime, mode, wi);
+				break;
 			}
-			return result;
+			result.setData(count);
+			result.setCount((Long) count);
+			break;
+		default:
+			switch (Objects.toString(statement.getFormat(), "")) {
+			case Statement.FORMAT_SCRIPT:
+				data = this.script(effectivePerson, statement, runtime, Statement.MODE_DATA, wi);
+				count = this.script(effectivePerson, statement, runtime, Statement.MODE_COUNT, wi);
+				break;
+			default:
+				data = this.jpql(effectivePerson, statement, runtime, Statement.MODE_DATA, wi);
+				count = this.jpql(effectivePerson, statement, runtime, Statement.MODE_COUNT, wi);
+				break;
+			}
+			result.setData(data);
+			result.setCount((Long) count);
 		}
+		return result;
 	}
 
-	private Object script(EffectivePerson effectivePerson, Business business, Statement statement, Runtime runtime, String mode, Wi wi)
+	private Object script(EffectivePerson effectivePerson, Statement statement, Runtime runtime, String mode, Wi wi)
 			throws Exception {
 		Object data = null;
-		ScriptContext scriptContext = this.scriptContext(effectivePerson, business, runtime);
-		ScriptFactory.initialServiceScriptText().eval(scriptContext);
-		String scriptText = statement.getScriptText();
-		if(Statement.MODE_COUNT.equals(mode)) {
-			scriptText = statement.getCountScriptText();
-		}
-		Object o = ScriptFactory.scriptEngine.eval(ScriptFactory.functionalization(scriptText),
-				scriptContext);
-		String jpql = ScriptFactory.asString(o);
-		Class<? extends JpaObject> cls = this.clazz(business, statement);
-		EntityManager em;
-		if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
-				&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
-			em = business.entityManagerContainer().get(DynamicBaseEntity.class);
-		}else{
-			em = business.entityManagerContainer().get(cls);
-		}
-		jpql = joinSql(jpql, wi, business);
-		logger.info("执行的sql:{}",jpql);
-		Query query;
-		String upJpql = jpql.toUpperCase();
-		if(upJpql.indexOf(JOIN_KEY) > -1 && upJpql.indexOf(JOIN_ON_KEY) > -1){
-			query = em.createNativeQuery(jpql);
-		}else{
-			query = em.createQuery(jpql);
-		}
-		for (Parameter<?> p : query.getParameters()) {
-			if (runtime.hasParameter(p.getName())) {
-				query.setParameter(p.getName(), runtime.getParameter(p.getName()));
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			ScriptContext scriptContext = this.scriptContext(effectivePerson, business, runtime);
+			ScriptFactory.initialServiceScriptText().eval(scriptContext);
+			String scriptText = statement.getScriptText();
+			if (Statement.MODE_COUNT.equals(mode)) {
+				scriptText = statement.getCountScriptText();
 			}
-		}
-		if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
-			if(Statement.MODE_COUNT.equals(mode)) {
-				data = query.getSingleResult();
-			}else{
-				query.setFirstResult((runtime.page - 1) * runtime.size);
-				query.setMaxResults(runtime.size);
-				data = query.getResultList();
+			Object o = ScriptFactory.scriptEngine.eval(ScriptFactory.functionalization(scriptText), scriptContext);
+			String jpql = ScriptFactory.asString(o);
+			Class<? extends JpaObject> cls = this.clazz(business, statement);
+			EntityManager em;
+			if (StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
+					&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
+				em = business.entityManagerContainer().get(DynamicBaseEntity.class);
+			} else {
+				em = business.entityManagerContainer().get(cls);
+			}
+			jpql = joinSql(jpql, wi, business);
+			logger.info("执行的sql:{}", jpql);
+			Query query;
+			String upJpql = jpql.toUpperCase();
+			if (upJpql.indexOf(JOIN_KEY) > -1 && upJpql.indexOf(JOIN_ON_KEY) > -1) {
+				query = em.createNativeQuery(jpql);
+			} else {
+				query = em.createQuery(jpql);
+			}
+			for (Parameter<?> p : query.getParameters()) {
+				if (runtime.hasParameter(p.getName())) {
+					query.setParameter(p.getName(), runtime.getParameter(p.getName()));
+				}
+			}
+			if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
+				if (Statement.MODE_COUNT.equals(mode)) {
+					data = query.getSingleResult();
+				} else {
+					query.setFirstResult((runtime.page - 1) * runtime.size);
+					query.setMaxResults(runtime.size);
+					data = query.getResultList();
+				}
+			} else {
+				business.entityManagerContainer().beginTransaction(cls);
+				data = query.executeUpdate();
+				business.entityManagerContainer().commit();
 			}
-		} else {
-			business.entityManagerContainer().beginTransaction(cls);
-			data = query.executeUpdate();
-			business.entityManagerContainer().commit();
 		}
 		return data;
 	}
 
-	private Object jpql(EffectivePerson effectivePerson, Business business, Statement statement, Runtime runtime, String mode, Wi wi)
+	private Object jpql(EffectivePerson effectivePerson, Statement statement, Runtime runtime, String mode, Wi wi)
 			throws Exception {
 		Object data = null;
-		Class<? extends JpaObject> cls = this.clazz(business, statement);
-		EntityManager em;
-		if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
-				&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)){
-			em = business.entityManagerContainer().get(DynamicBaseEntity.class);
-		}else{
-			em = business.entityManagerContainer().get(cls);
-		}
-		String jpql = statement.getData();
-		if(Statement.MODE_COUNT.equals(mode)) {
-			jpql = statement.getCountData();
-		}
-		jpql = joinSql(jpql, wi, business);
-		logger.info("执行的sql:{}",jpql);
-		Query query;
-		String upJpql = jpql.toUpperCase();
-		if(upJpql.indexOf(JOIN_KEY) > -1 && upJpql.indexOf(JOIN_ON_KEY) > -1){
-			query = em.createNativeQuery(jpql);
-		}else{
-			query = em.createQuery(jpql);
-		}
-		for (Parameter<?> p : query.getParameters()) {
-			if (runtime.hasParameter(p.getName())) {
-				query.setParameter(p.getName(), runtime.getParameter(p.getName()));
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			Class<? extends JpaObject> cls = this.clazz(business, statement);
+			EntityManager em;
+			if (StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
+					&& StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
+				em = business.entityManagerContainer().get(DynamicBaseEntity.class);
+			} else {
+				em = business.entityManagerContainer().get(cls);
 			}
-		}
-		if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
-			if(Statement.MODE_COUNT.equals(mode)) {
-				data = query.getSingleResult();
-			}else{
-				query.setFirstResult((runtime.page - 1) * runtime.size);
-				query.setMaxResults(runtime.size);
-				data = query.getResultList();
+			String jpql = statement.getData();
+			if (Statement.MODE_COUNT.equals(mode)) {
+				jpql = statement.getCountData();
+			}
+			jpql = joinSql(jpql, wi, business);
+			logger.info("执行的sql:{}", jpql);
+			Query query;
+			String upJpql = jpql.toUpperCase();
+			if (upJpql.indexOf(JOIN_KEY) > -1 && upJpql.indexOf(JOIN_ON_KEY) > -1) {
+				query = em.createNativeQuery(jpql);
+			} else {
+				query = em.createQuery(jpql);
+			}
+			for (Parameter<?> p : query.getParameters()) {
+				if (runtime.hasParameter(p.getName())) {
+					query.setParameter(p.getName(), runtime.getParameter(p.getName()));
+				}
+			}
+			if (StringUtils.equalsIgnoreCase(statement.getType(), Statement.TYPE_SELECT)) {
+				if (Statement.MODE_COUNT.equals(mode)) {
+					data = query.getSingleResult();
+				} else {
+					query.setFirstResult((runtime.page - 1) * runtime.size);
+					query.setMaxResults(runtime.size);
+					data = query.getResultList();
+				}
+			} else {
+				business.entityManagerContainer().beginTransaction(cls);
+				data = Integer.valueOf(query.executeUpdate());
+				business.entityManagerContainer().commit();
 			}
-		} else {
-			business.entityManagerContainer().beginTransaction(cls);
-			data = Integer.valueOf(query.executeUpdate());
-			business.entityManagerContainer().commit();
 		}
 		return data;
 	}
@@ -234,8 +239,8 @@ class ActionExecuteV2 extends BaseAction {
 		return scriptContext;
 	}
 
-	private String joinSql(String sql, Wi wi, Business business) throws Exception{
-		if(wi.getFilterList()!=null && !wi.getFilterList().isEmpty()) {
+	private String joinSql(String sql, Wi wi, Business business) throws Exception {
+		if (wi.getFilterList() != null && !wi.getFilterList().isEmpty()) {
 			List<String> list = new ArrayList<>();
 			String whereSql = sql.replaceAll("\\s{1,}", " ");
 			String rightSql = "";
@@ -251,7 +256,7 @@ class ActionExecuteV2 extends BaseAction {
 				hasWhere = true;
 			}
 			String matchKey = "";
-			for(String key : keys){
+			for (String key : keys) {
 				if (whereSql.indexOf(key) > -1) {
 					matchKey = key;
 					rightSql = StringUtils.substringAfter(whereSql, key);
@@ -260,50 +265,52 @@ class ActionExecuteV2 extends BaseAction {
 				}
 			}
 			List<String> filterList = new ArrayList<>();
-			for (FilterEntry filterEntry : wi.getFilterList()){
-				if(StringUtils.isNotBlank(filterEntry.path) && StringUtils.isNotBlank(filterEntry.value)){
+			for (FilterEntry filterEntry : wi.getFilterList()) {
+				if (StringUtils.isNotBlank(filterEntry.path) && StringUtils.isNotBlank(filterEntry.value)) {
 					StringBuilder sb = new StringBuilder();
 					sb.append(filterEntry.path);
 					sb.append(" ");
 					sb.append(Comparison.getMatchCom(filterEntry.comparison));
 					sb.append(" ");
-					sb.append(":"+filterEntry.value);
+					sb.append(":" + filterEntry.value);
 					filterList.add(sb.toString());
 				}
 			}
-			if(hasWhere){
+			if (hasWhere) {
 				list.add(leftSql);
 				list.add("WHERE");
-			}else{
+			} else {
 				list.add(whereSql);
-				if(!filterList.isEmpty()){
+				if (!filterList.isEmpty()) {
 					list.add("WHERE");
 				}
 			}
-			if(!filterList.isEmpty()){
+			if (!filterList.isEmpty()) {
 				list.add("(");
 				list.add(StringUtils.join(filterList, " AND "));
 				list.add(")");
 			}
-			if(hasWhere){
+			if (hasWhere) {
 				list.add("AND");
 				list.add("(");
 				list.add(whereSql);
 				list.add(")");
 			}
-			if(StringUtils.isNotBlank(matchKey)){
+			if (StringUtils.isNotBlank(matchKey)) {
 				list.add(matchKey);
 				list.add(rightSql);
 			}
 			sql = StringUtils.join(list, " ");
 		}
 		String upSql = sql.toUpperCase();
-		if(upSql.indexOf(JOIN_KEY) > -1 && upSql.indexOf(JOIN_ON_KEY) > -1){
+		if (upSql.indexOf(JOIN_KEY) > -1 && upSql.indexOf(JOIN_ON_KEY) > -1) {
 			sql = sql.replaceAll("\\.", ".x");
 			sql = sql.replaceAll("\\.x\\*", ".*");
-			List<Table> tables = business.entityManagerContainer().fetchEqual(Table.class, ListTools.toList(Table.name_FIELDNAME), Table.status_FIELDNAME, Table.STATUS_build);
-			for (Table table : tables){
-				sql = sql.replaceAll(" "+table.getName()+" ", " "+DynamicEntity.TABLE_PREFIX + table.getName().toUpperCase()+" ");
+			List<Table> tables = business.entityManagerContainer().fetchEqual(Table.class,
+					ListTools.toList(Table.name_FIELDNAME), Table.status_FIELDNAME, Table.STATUS_build);
+			for (Table table : tables) {
+				sql = sql.replaceAll(" " + table.getName() + " ",
+						" " + DynamicEntity.TABLE_PREFIX + table.getName().toUpperCase() + " ");
 			}
 		}
 		return sql;
@@ -325,10 +332,8 @@ class ActionExecuteV2 extends BaseAction {
 
 	public static class Wi extends GsonPropertyObject {
 		@FieldDescribe("过滤")
-		@FieldTypeDescribe(fieldType="class",fieldTypeName = "com.x.query.core.express.plan.FilterEntry",
-				fieldValue="{\"logic\": \"and\", \"path\": \"o.name\", \"comparison\": \"equals\", \"value\": \"name\", \"formatType\": \"textValue\"}",
-				fieldSample="{\"logic\":\"逻辑运算:and\",\"path\":\"data数据的路径:o.title\",\"comparison\":\"比较运算符:equals|notEquals|like|notLike|greaterThan|greaterThanOrEqualTo|lessThan|lessThanOrEqualTo\"," +
-						"\"value\":\"7月\",\"formatType\":\"textValue|numberValue|dateTimeValue|booleanValue\"}")
+		@FieldTypeDescribe(fieldType = "class", fieldTypeName = "com.x.query.core.express.plan.FilterEntry", fieldValue = "{\"logic\": \"and\", \"path\": \"o.name\", \"comparison\": \"equals\", \"value\": \"name\", \"formatType\": \"textValue\"}", fieldSample = "{\"logic\":\"逻辑运算:and\",\"path\":\"data数据的路径:o.title\",\"comparison\":\"比较运算符:equals|notEquals|like|notLike|greaterThan|greaterThanOrEqualTo|lessThan|lessThanOrEqualTo\","
+				+ "\"value\":\"7月\",\"formatType\":\"textValue|numberValue|dateTimeValue|booleanValue\"}")
 		private List<FilterEntry> filterList = new TreeList<>();
 
 		@FieldDescribe("参数")

+ 39 - 34
o2server/x_query_assemble_surface/src/main/java/com/x/query/assemble/surface/jaxrs/statement/BaseAction.java

@@ -12,48 +12,53 @@ import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.query.assemble.surface.Business;
 import com.x.query.core.entity.schema.Statement;
 import com.x.query.core.express.statement.Runtime;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.project.cache.Cache.CacheCategory;
 
 abstract class BaseAction extends StandardJaxrsAction {
 
 	protected CacheCategory cache = new CacheCategory(Statement.class);
 
-	protected Runtime runtime(EffectivePerson effectivePerson, JsonElement jsonElement, Business business, Integer page,
-			Integer size) throws Exception {
+	protected Runtime runtime(EffectivePerson effectivePerson, JsonElement jsonElement, Integer page, Integer size)
+			throws Exception {
 		Runtime runtime = new Runtime();
-		if (null == jsonElement || jsonElement.isJsonNull()) {
-			runtime.parameters = new HashMap<String, Object>();
-		} else {
-			runtime.parameters = XGsonBuilder.instance().fromJson(jsonElement, new TypeToken<Map<String, Object>>() {
-			}.getType());
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			Business business = new Business(emc);
+			if (null == jsonElement || jsonElement.isJsonNull()) {
+				runtime.parameters = new HashMap<String, Object>();
+			} else {
+				runtime.parameters = XGsonBuilder.instance().fromJson(jsonElement,
+						new TypeToken<Map<String, Object>>() {
+						}.getType());
+			}
+			runtime.page = this.adjustPage(page);
+			runtime.size = this.adjustSize(size);
+			Set<String> keys = runtime.parameters.keySet();
+			if (keys.contains(Runtime.PARAMETER_PERSON)) {
+				runtime.parameters.put(Runtime.PARAMETER_PERSON, effectivePerson.getDistinguishedName());
+			}
+			if (keys.contains(Runtime.PARAMETER_IDENTITYLIST)) {
+				runtime.parameters.put(Runtime.PARAMETER_IDENTITYLIST,
+						business.organization().identity().listWithPerson(effectivePerson));
+			}
+			if (keys.contains(Runtime.PARAMETER_UNITLIST)) {
+				runtime.parameters.put(Runtime.PARAMETER_UNITLIST,
+						business.organization().unit().listWithPerson(effectivePerson));
+			}
+			if (keys.contains(Runtime.PARAMETER_UNITALLLIST)) {
+				runtime.parameters.put(Runtime.PARAMETER_UNITALLLIST,
+						business.organization().unit().listWithPersonSupNested(effectivePerson));
+			}
+			if (keys.contains(Runtime.PARAMETER_GROUPLIST)) {
+				runtime.parameters.put(Runtime.PARAMETER_GROUPLIST,
+						business.organization().group().listWithPerson(effectivePerson));
+			}
+			if (keys.contains(Runtime.PARAMETER_ROLELIST)) {
+				runtime.parameters.put(Runtime.PARAMETER_ROLELIST,
+						business.organization().role().listWithPerson(effectivePerson));
+			}
 		}
-		runtime.page = this.adjustPage(page);
-		runtime.size = this.adjustSize(size);
-		Set<String> keys = runtime.parameters.keySet();
-		if (keys.contains(Runtime.PARAMETER_PERSON)) {
-			runtime.parameters.put(Runtime.PARAMETER_PERSON, effectivePerson.getDistinguishedName());
-		}
-		if (keys.contains(Runtime.PARAMETER_IDENTITYLIST)) {
-			runtime.parameters.put(Runtime.PARAMETER_IDENTITYLIST,
-					business.organization().identity().listWithPerson(effectivePerson));
-		}
-		if (keys.contains(Runtime.PARAMETER_UNITLIST)) {
-			runtime.parameters.put(Runtime.PARAMETER_UNITLIST,
-					business.organization().unit().listWithPerson(effectivePerson));
-		}
-		if (keys.contains(Runtime.PARAMETER_UNITALLLIST)) {
-			runtime.parameters.put(Runtime.PARAMETER_UNITALLLIST,
-					business.organization().unit().listWithPersonSupNested(effectivePerson));
-		}
-		if (keys.contains(Runtime.PARAMETER_GROUPLIST)) {
-			runtime.parameters.put(Runtime.PARAMETER_GROUPLIST,
-					business.organization().group().listWithPerson(effectivePerson));
-		}
-		if (keys.contains(Runtime.PARAMETER_ROLELIST)) {
-			runtime.parameters.put(Runtime.PARAMETER_ROLELIST,
-					business.organization().role().listWithPerson(effectivePerson));
-		}
-
 		return runtime;
 	}
 }