提交 e102f882 编写于 作者: O o2null

Merge branch 'feature/自建表支持join查询' into 'wrdp'

[数据中心]自建表支持join查询

See merge request o2oa/o2oa!2114
......@@ -14,6 +14,7 @@ import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.script.AbstractResources;
import com.x.base.core.project.script.ScriptFactory;
import com.x.base.core.project.tools.ListTools;
import com.x.base.core.project.webservices.WebservicesClient;
import com.x.organization.core.express.Organization;
import com.x.query.assemble.designer.Business;
......@@ -29,12 +30,16 @@ import javax.persistence.Query;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.SimpleScriptContext;
import java.util.List;
import java.util.Objects;
class ActionExecuteV2 extends BaseAction {
private static Logger logger = LoggerFactory.getLogger(ActionExecuteV2.class);
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 {
......@@ -106,7 +111,7 @@ class ActionExecuteV2 extends BaseAction {
}
Object o = ScriptFactory.scriptEngine.eval(ScriptFactory.functionalization(scriptText),
scriptContext);
String text = ScriptFactory.asString(o);
String jpql = ScriptFactory.asString(o);
Class<? extends JpaObject> cls = this.clazz(business, statement);
EntityManager em;
if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
......@@ -115,7 +120,14 @@ class ActionExecuteV2 extends BaseAction {
}else{
em = business.entityManagerContainer().get(cls);
}
Query query = em.createQuery(text);
jpql = this.joinSql(jpql, business);
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()));
......@@ -148,11 +160,18 @@ class ActionExecuteV2 extends BaseAction {
}else{
em = business.entityManagerContainer().get(cls);
}
String jpqlData = statement.getData();
String jpql = statement.getData();
if(Statement.MODE_COUNT.equals(mode)) {
jpqlData = statement.getCountData();
jpql = statement.getCountData();
}
jpql = this.joinSql(jpql, business);
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);
}
Query query = em.createQuery(jpqlData);
for (Parameter<?> p : query.getParameters()) {
if (runtime.hasParameter(p.getName())) {
query.setParameter(p.getName(), runtime.getParameter(p.getName()));
......@@ -206,6 +225,19 @@ class ActionExecuteV2 extends BaseAction {
return scriptContext;
}
private String joinSql(String sql, Business business) throws Exception{
String upSql = sql.toUpperCase();
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()+" ");
}
}
return sql;
}
public static class Resources extends AbstractResources {
private Organization organization;
......
......@@ -17,6 +17,7 @@ import com.x.base.core.project.logger.Logger;
import com.x.base.core.project.logger.LoggerFactory;
import com.x.base.core.project.script.AbstractResources;
import com.x.base.core.project.script.ScriptFactory;
import com.x.base.core.project.tools.ListTools;
import com.x.base.core.project.webservices.WebservicesClient;
import com.x.organization.core.express.Organization;
import com.x.query.assemble.surface.Business;
......@@ -43,6 +44,8 @@ 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 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 {
......@@ -115,7 +118,7 @@ class ActionExecuteV2 extends BaseAction {
}
Object o = ScriptFactory.scriptEngine.eval(ScriptFactory.functionalization(scriptText),
scriptContext);
String text = ScriptFactory.asString(o);
String jpql = ScriptFactory.asString(o);
Class<? extends JpaObject> cls = this.clazz(business, statement);
EntityManager em;
if(StringUtils.equalsIgnoreCase(statement.getEntityCategory(), Statement.ENTITYCATEGORY_DYNAMIC)
......@@ -124,9 +127,15 @@ class ActionExecuteV2 extends BaseAction {
}else{
em = business.entityManagerContainer().get(cls);
}
text = joinSql(text, wi);
logger.print("执行的sql:{}",text);
Query query = em.createQuery(text);
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()));
......@@ -159,13 +168,19 @@ class ActionExecuteV2 extends BaseAction {
}else{
em = business.entityManagerContainer().get(cls);
}
String jpqlData = statement.getData();
String jpql = statement.getData();
if(Statement.MODE_COUNT.equals(mode)) {
jpqlData = statement.getCountData();
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);
}
jpqlData = joinSql(jpqlData, wi);
logger.print("执行的sql:{}",jpqlData);
Query query = em.createQuery(jpqlData);
for (Parameter<?> p : query.getParameters()) {
if (runtime.hasParameter(p.getName())) {
query.setParameter(p.getName(), runtime.getParameter(p.getName()));
......@@ -219,7 +234,7 @@ class ActionExecuteV2 extends BaseAction {
return scriptContext;
}
private String joinSql(String sql, Wi wi) throws Exception{
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,}", " ");
......@@ -282,6 +297,15 @@ class ActionExecuteV2 extends BaseAction {
}
sql = StringUtils.join(list, " ");
}
String upSql = sql.toUpperCase();
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()+" ");
}
}
return sql;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册