提交 78c682ad 编写于 作者: O o2sword

自定义表查询允许跨表关联查询

上级 86b728f4
......@@ -7,11 +7,12 @@ import java.util.List;
import java.util.Properties;
import com.x.base.core.container.FactorDistributionPolicy;
import com.x.base.core.entity.dynamic.DynamicBaseEntity;
import com.x.base.core.entity.JpaObject;
import com.x.base.core.entity.dynamic.DynamicEntity;
import com.x.base.core.entity.tools.JpaObjectTools;
import com.x.base.core.project.config.Config;
import com.x.base.core.project.config.Node;
import com.x.base.core.project.tools.Crypto;
import com.x.base.core.project.tools.ListTools;
import org.apache.commons.io.FileUtils;
......@@ -146,7 +147,7 @@ public class PersistenceXmlHelper {
property.addAttribute("value", "false");
}
public static List<String> write(String path, List<String> entities) throws Exception {
public static List<String> write(String path, List<String> entities, boolean dynamicFlag) throws Exception {
List<String> names = new ArrayList<>();
String name = "";
try {
......@@ -157,6 +158,7 @@ public class PersistenceXmlHelper {
persistence.addAttribute(QName.get("schemaLocation", "xsi", "http://www.w3.org/2001/XMLSchema-instance"),
"http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd");
persistence.addAttribute("version", "2.0");
List<String> dyClasses = new ArrayList<>();
for (String className : names) {
name = className;
Class<? extends JpaObject> clazz = (Class<JpaObject>) Class.forName(className);
......@@ -170,6 +172,33 @@ public class PersistenceXmlHelper {
mapped_element.addText(o.getName());
}
}
if(dynamicFlag) {
for (String className : names) {
if (className.startsWith(DynamicEntity.CLASS_PACKAGE)) {
dyClasses.add(className);
}
}
if (!dyClasses.isEmpty()) {
String dyClassName = DynamicBaseEntity.class.getName();
names.add(dyClassName);
Element unit = persistence.addElement("persistence-unit");
unit.addAttribute("name", dyClassName);
unit.addAttribute("transaction-type", "RESOURCE_LOCAL");
Element provider = unit.addElement("provider");
provider.addText(PersistenceProviderImpl.class.getName());
for (String dyClass : dyClasses) {
Element mapped_element = unit.addElement("class");
mapped_element.addText(dyClass);
}
for (Class<?> o : JpaObjectTools.scanMappedSuperclass(DynamicBaseEntity.class)) {
if(!o.getName().equals(DynamicBaseEntity.class.getName())) {
Element mapped_element = unit.addElement("class");
mapped_element.addText(o.getName());
}
}
}
}
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
File file = new File(path);
......
......@@ -49,7 +49,7 @@ public abstract class SliceEntityManagerContainerFactory {
protected SliceEntityManagerContainerFactory(String webApplicationDirectory, List<String> entities,
boolean sliceFeatureEnable) throws Exception {
File path = new File(webApplicationDirectory + "/WEB-INF/classes/" + PERSISTENCE_XML_PATH);
List<String> classNames = PersistenceXmlHelper.write(path.getAbsolutePath(), entities);
List<String> classNames = PersistenceXmlHelper.write(path.getAbsolutePath(), entities, true);
for (String className : classNames) {
Class<? extends JpaObject> clz = (Class<? extends JpaObject>) Class.forName(className);
checkPersistFieldMap.put(clz, this.loadCheckPersistField(clz));
......
package com.x.base.core.entity.dynamic;
import com.x.base.core.entity.SliceJpaObject;
public class DynamicBaseEntity extends SliceJpaObject {
private static final long serialVersionUID = -4334572608549855123L;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
private String id = createId();
/* 以上为 JpaObject 默认字段 */
public void onPersist() throws Exception {
}
}
......@@ -88,7 +88,7 @@ public class DumpData {
logger.print("find {} data to dump, start at {}.", classNames.size(), DateTools.format(start));
Path xml = Paths.get(Config.dir_local_temp_classes().getAbsolutePath(),
DateTools.compact(start) + "_dump.xml");
PersistenceXmlHelper.write(xml.toString(), classNames);
PersistenceXmlHelper.write(xml.toString(), classNames, false);
StorageMappings storageMappings = Config.storageMappings();
Stream<String> stream = BooleanUtils.isTrue(Config.dumpRestoreData().getParallel())
? classNames.parallelStream()
......
......@@ -69,7 +69,7 @@ public abstract class EraseContent {
StorageMappings storageMappings = Config.storageMappings();
File persistence = new File(Config.dir_local_temp_classes(),
DateTools.compact(this.start) + "_eraseContent.xml");
PersistenceXmlHelper.write(persistence.getAbsolutePath(), classNames);
PersistenceXmlHelper.write(persistence.getAbsolutePath(), classNames, false);
for (int i = 0; i < classNames.size(); i++) {
Class<? extends JpaObject> cls = (Class<? extends JpaObject>) Thread.currentThread()
.getContextClassLoader().loadClass(classNames.get(i));
......
......@@ -101,7 +101,7 @@ public class RestoreData {
logger.print("find: {} data to restore, path: {}.", classNames.size(), this.dir.toString());
Path xml = Paths.get(Config.dir_local_temp_classes().getAbsolutePath(),
DateTools.compact(start) + "_restore.xml");
PersistenceXmlHelper.write(xml.toString(), classNames);
PersistenceXmlHelper.write(xml.toString(), classNames, false);
Stream<String> stream = BooleanUtils.isTrue(Config.dumpRestoreData().getParallel())
? classNames.parallelStream()
: classNames.stream();
......
......@@ -9,6 +9,7 @@ import javax.script.Bindings;
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;
......@@ -95,7 +96,13 @@ class ActionExecute extends BaseAction {
throws Exception {
Object data = null;
Class<? extends JpaObject> cls = this.clazz(business, statement);
EntityManager em = business.entityManagerContainer().get(cls);
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())) {
......
......@@ -3,6 +3,7 @@ package com.x.query.assemble.designer.jaxrs.table;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import com.x.base.core.entity.dynamic.DynamicBaseEntity;
import org.apache.commons.lang3.StringUtils;
import com.google.gson.JsonElement;
......@@ -36,10 +37,11 @@ class ActionExecute extends BaseAction {
DynamicEntity dynamicEntity = new DynamicEntity(table.getName());
@SuppressWarnings("unchecked")
Class<? extends JpaObject> cls = (Class<JpaObject>) Class.forName(dynamicEntity.className());
EntityManager em = emc.get(cls);
Query query = em.createQuery(wi.getData());
Object data = null;
if (StringUtils.equalsIgnoreCase(wi.getType(), Statement.TYPE_SELECT)) {
EntityManager em = emc.get(DynamicBaseEntity.class);
Query query = em.createQuery(wi.getData());
if ((null != wi.getMaxResults()) && (wi.getMaxResults() > 0)) {
query.setMaxResults(wi.getMaxResults());
}
......@@ -48,6 +50,8 @@ class ActionExecute extends BaseAction {
}
data = query.getResultList();
} else {
EntityManager em = emc.get(cls);
Query query = em.createQuery(wi.getData());
emc.beginTransaction(cls);
data = query.executeUpdate();
emc.commit();
......
......@@ -10,6 +10,7 @@ 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;
......@@ -132,7 +133,14 @@ class ActionExecute extends BaseAction {
throws Exception {
Object data = null;
Class<? extends JpaObject> cls = this.clazz(business, statement);
EntityManager em = business.entityManagerContainer().get(cls);
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())) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册