package com.x.base.core.container; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.List; import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.persistence.Tuple; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.persistence.criteria.Selection; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.collections4.list.TreeList; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.reflect.FieldUtils; import com.x.base.core.container.factory.EntityManagerContainerFactory; import com.x.base.core.entity.JpaObject; import com.x.base.core.entity.annotation.CheckPersist; import com.x.base.core.entity.annotation.CheckPersistType; import com.x.base.core.entity.annotation.CheckRemove; import com.x.base.core.entity.annotation.CheckRemoveType; import com.x.base.core.entity.annotation.RestrictFlag; import com.x.base.core.entity.tools.JpaObjectTools; import com.x.base.core.project.bean.WrapCopier; import com.x.base.core.project.exception.ExceptionWhen; import com.x.base.core.project.gson.GsonPropertyObject; import com.x.base.core.project.gson.XGsonBuilder; import com.x.base.core.project.tools.ListTools; import com.x.base.core.project.tools.NumberTools; import com.x.base.core.project.tools.StringTools; public class EntityManagerContainer extends EntityManagerContainerBasic { public static final Integer DEFAULT_PAGESIZE = 20; public static final Integer MAX_PAGESIZE = 1000; public EntityManagerContainer(EntityManagerContainerFactory entityManagerContainerFactory) { super(entityManagerContainerFactory); } public void persist(JpaObject o) throws Exception { // o.onPersist(); this.get(o.getClass()).persist(o); } public void persist(JpaObject o, CheckPersistType type) throws Exception { if (!type.equals(CheckPersistType.none)) { check(o, type); } this.get(o.getClass()).persist(o); } public void remove(JpaObject o) throws Exception { this.get(o.getClass()).remove(o); } public void remove(JpaObject o, CheckRemoveType type) throws Exception { if (!type.equals(CheckRemoveType.none)) { check(o, type); } this.get(o.getClass()).remove(o); } @SuppressWarnings("unchecked") public void check(JpaObject jpa, CheckPersistType checkPersistType) throws Exception { jpa.onPersist(); for (Entry entry : entityManagerContainerFactory.getCheckPersistFields(jpa.getClass()) .entrySet()) { Field field = entry.getKey(); CheckPersist checkPersist = entry.getValue(); FieldType fieldType = this.getFieldType(entry.getKey()); // Object object = jpa.get(field.getName()); Object object = FieldUtils.readField(field, jpa, true); switch (fieldType) { case stringValue: this.persistChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa, checkPersist, checkPersistType); break; case stringValueList: this.persistChecker.stringValueList.check(field, null == object ? null : (List) object, jpa, checkPersist, checkPersistType); break; case dateValue: this.persistChecker.dateValue.check(field, (null == object ? null : (Date) object), jpa, checkPersist, checkPersistType); break; case dateValueList: this.persistChecker.dateValueList.check(field, (null == object ? null : (List) object), jpa, checkPersist, checkPersistType); break; case booleanValue: this.persistChecker.booleanValue.check(field, (null == object ? null : (Boolean) object), jpa, checkPersist, checkPersistType); break; case booleanValueList: this.persistChecker.booleanValueList.check(field, (null == object ? null : (List) object), jpa, checkPersist, checkPersistType); break; case integerValue: this.persistChecker.integerValue.check(field, (null == object ? null : (Integer) object), jpa, checkPersist, checkPersistType); break; case integerValueList: this.persistChecker.integerValueList.check(field, (null == object ? null : (List) object), jpa, checkPersist, checkPersistType); break; case doubleValue: this.persistChecker.doubleValue.check(field, (null == object ? null : (Double) object), jpa, checkPersist, checkPersistType); break; case doubleValueList: this.persistChecker.doubleValueList.check(field, (null == object ? null : (List) object), jpa, checkPersist, checkPersistType); break; case longValue: this.persistChecker.longValue.check(field, (null == object ? null : (Long) object), jpa, checkPersist, checkPersistType); break; case longValueList: this.persistChecker.longValueList.check(field, (null == object ? null : (List) object), jpa, checkPersist, checkPersistType); break; case floatValue: this.persistChecker.floatValue.check(field, (null == object ? null : (Float) object), jpa, checkPersist, checkPersistType); break; case floatValueList: this.persistChecker.floatValueList.check(field, (null == object ? null : (List) object), jpa, checkPersist, checkPersistType); break; case byteValueArray: this.persistChecker.byteValueArray.check(field, (null == object ? null : (byte[]) object), jpa, checkPersist, checkPersistType); break; case enumValue: break; default: break; } } } @SuppressWarnings("unchecked") public void check(JpaObject jpa, CheckRemoveType checkRemoveType) throws Exception { for (Entry entry : entityManagerContainerFactory.getCheckRemoveFields(jpa.getClass()) .entrySet()) { Field field = entry.getKey(); CheckRemove checkRemove = entry.getValue(); FieldType fieldType = this.getFieldType(entry.getKey()); // Object object = jpa.get(field.getName()); Object object = FieldUtils.readField(field, jpa, true); switch (fieldType) { case stringValue: this.removeChecker.stringValue.check(field, null == object ? null : Objects.toString(object), jpa, checkRemove, checkRemoveType); break; case stringValueList: this.removeChecker.stringValueList.check(field, null == object ? null : (List) object, jpa, checkRemove, checkRemoveType); break; default: break; } } } /** * 判断id在实体类中是否可用 * * @param id * @param cls * @return * @throws Exception */ public boolean idle(String id, Class cls) throws Exception { T t = this.fetch(id, cls, new ArrayList()); if (t == null) { return true; } return false; } public T find(String id, Class cls) throws Exception { return this.find(id, cls, ExceptionWhen.none, false); } public T find(String id, Class cls, ExceptionWhen exceptionWhen) throws Exception { return this.find(id, cls, exceptionWhen, false); } public T find(String id, Class cls, ExceptionWhen exceptionWhen, boolean startTransaction) throws Exception { EntityManager em = startTransaction ? this.beginTransaction(cls) : this.get(cls); T t = null; /* 判断字段长度在定义范围之内否则db2会报错 */ if (StringUtils.isNotEmpty(id) && JpaObjectTools.withinDefinedLength(id, cls, JpaObject.id_FIELDNAME)) { t = em.find(cls, id); } switch (exceptionWhen) { case not_found: if (null == t) { throw new Exception("can not find entity id: " + id + ", class: " + cls.getCanonicalName() + "."); } break; case found: if (null != t) { throw new Exception("entity already existed, id: " + id + ", class: " + cls.getCanonicalName() + "."); } break; default: break; } return t; } public T flag(String flag, Class cls) throws Exception { return this.flag(flag, cls, this.entityManagerContainerFactory.getFlagFields(cls)); } private T flag(String flag, Class cls, List fields) throws Exception { EntityManager em = this.get(cls); if (StringUtils.isEmpty(flag) || ListTools.isEmpty(fields)) { return null; } T t = null; out: for (Field field : fields) { if (!JpaObjectTools.withinDefinedLength(flag, cls, field)) { continue; } CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(field.getName()), flag); List list = em.createQuery(cq.select(root).where(p)).setMaxResults(2).getResultList().stream().distinct() .collect(Collectors.toList()); switch (list.size()) { case 0: break; case 1: t = list.get(0); break out; case 2: throw new IllegalStateException("flag get multiple entity flag:" + flag + ", class:" + cls.getName() + ", attribute:" + field.getName() + "."); } } return t; } public List flag(List FLAGS, Class cls) throws Exception { return this.flag(FLAGS, cls, this.entityManagerContainerFactory.getFlagFields(cls)); } private List flag(List FLAGS, Class cls, List fields) throws Exception { if (ListTools.isEmpty(fields)) { throw new IllegalStateException("attributes can not be empty."); } List list = new ArrayList<>(); if (ListTools.isEmpty(FLAGS)) { return list; } EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate[] ps = new Predicate[fields.size()]; for (int i = 0; i < fields.size(); i++) { String att = fields.get(i).getName(); Predicate p = root.get(att) .in(StringTools.filterLessThanOrEqualToUtf8Length(FLAGS, JpaObjectTools.definedLength(cls, att))); ps[i] = p; } list.addAll(em.createQuery(cq.select(root).where(cb.or(ps))).getResultList()); return list; } public T restrictFlag(String flag, Class cls, String singularAttribute, Object restrictValue) throws Exception { return this.restrictFlag(flag, cls, singularAttribute, restrictValue, this.entityManagerContainerFactory.getRestrictFlagFields(cls)); } public T restrictFlag(String flag, Class cls, String singularAttribute, Object restrictValue, List fields) throws Exception { EntityManager em = this.get(cls); if (StringUtils.isEmpty(flag)) { return null; } T t = null; out: for (Field field : fields) { if (!JpaObjectTools.withinDefinedLength(flag, cls, field)) { continue; } CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(field.getName()), flag); p = cb.and(p, cb.equal(root.get(singularAttribute), restrictValue)); cq.select(root).where(p); List list = em.createQuery(cq).setMaxResults(2).getResultList(); switch (list.size()) { case 0: break; case 1: t = list.get(0); break out; default: throw new Exception("flag get multiple entity flag:" + flag + ", class:" + cls.getName() + ", attribute:" + field.getName() + ", restrict attrubte:" + singularAttribute + ", restrict value:" + restrictValue + "."); } } return t; } public List listAll(Class cls) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); List os = em.createQuery(cq.select(root)).getResultList(); List list = new ArrayList<>(os); return list; } public List list(Class cls, String... ids) throws Exception { return this.list(cls, false, ListTools.toList(ids)); } public List list(Class cls, Collection ids) throws Exception { return this.list(cls, false, ids); } public List list(Class cls, boolean ordered, String... ids) throws Exception { List list = new ArrayList<>(); for (String str : ids) { list.add(str); } return this.list(cls, ordered, list); } public List list(Class cls, boolean ordered, Collection ids) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); final List list = ListTools.trim(new ArrayList<>(ids), true, true); cq.select(root).where(cb.isMember(root.get(JpaObject.id_FIELDNAME), cb.literal(list))); List os = em.createQuery(cq).getResultList(); if (!ordered) { return new ArrayList(os); } List ordering = new ArrayList<>(os); Collections.sort(ordering, new Comparator() { public int compare(T t1, T t2) { return Integer.compare(list.indexOf(t1.getId()), list.indexOf(t2.getId())); } }); return ordering; } public List listEqual(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.equal(root.get(attribute), value)); List os = em.createQuery(cq).getResultList(); List list = new ArrayList<>(os); return list; } public > List listLessThan(Class cls, String attribute, W w) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.lessThan(root.get(attribute), w)); List os = em.createQuery(cq).getResultList(); List list = new ArrayList<>(os); return list; } public List listEqualAndEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root) .where(cb.and(cb.equal(root.get(attribute), value), cb.equal(root.get(otherAttribute), otherValue))); List os = em.createQuery(cq).getResultList(); return new TreeList(os); } public List listEqualAndEqualAndEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue, String thirdAttribute, Object thirdValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.and(cb.equal(root.get(attribute), value), cb.equal(root.get(otherAttribute), otherValue), cb.equal(root.get(thirdAttribute), thirdValue))); List os = em.createQuery(cq).getResultList(); return new TreeList(os); } public List listEqualAndEqualAndEqualAndNotEqual(Class cls, String firstAttribute, Object firstValue, String secondAttribute, Object secondValue, String thirdAttribute, Object thirdValue, String fourthAttribute, Object fourthValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.and(cb.equal(root.get(firstAttribute), firstValue), cb.equal(root.get(secondAttribute), secondValue), cb.equal(root.get(thirdAttribute), thirdValue), cb.notEqual(root.get(fourthAttribute), fourthValue))); List os = em.createQuery(cq).getResultList(); return new TreeList(os); } public List listEqualAndNotEqual(Class cls, String equalAttribute, Object equalValue, String notEqualAttribute, Object notEqualValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.and(cb.equal(root.get(equalAttribute), equalValue), cb.notEqual(root.get(notEqualAttribute), notEqualValue))); List os = em.createQuery(cq).getResultList(); return new TreeList(os); } public List listEqualAndEqualAndNotEqual(Class cls, String equalAttribute, Object equalValue, String otherEqualAttribute, Object otherEqualValue, String notEqualAttribute, Object notEqualValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root) .where(cb.and(cb.equal(root.get(equalAttribute), equalValue), cb.equal(root.get(otherEqualAttribute), otherEqualValue), cb.notEqual(root.get(notEqualAttribute), notEqualValue))); List os = em.createQuery(cq).getResultList(); return new TreeList(os); } public List listEqualAndIn(Class cls, String attribute, Object value, String otherAttribute, Collection otherValues) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(attribute), value); p = cb.and(p, cb.isMember(root.get(otherAttribute), cb.literal(otherValues))); List os = em.createQuery(cq.select(root).where(p)).getResultList(); List list = new ArrayList<>(os); return list; } public List listEqualAndNotIn(Class cls, String attribute, Object value, String otherAttribute, Collection otherValues) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(attribute), value); p = cb.and(p, cb.isNotMember(root.get(otherAttribute), cb.literal(otherValues))); List os = em.createQuery(cq.select(root).where(p)).getResultList(); List list = new ArrayList<>(os); return list; } public List listEqualAndEqualAndIn(Class cls, String firstAttribute, Object firstValue, String secondAttribute, Object secondValue, String thirdAttribute, Collection thirdValues) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(firstAttribute), firstValue); p = cb.and(p, cb.equal(root.get(secondAttribute), secondValue)); p = cb.and(p, cb.isMember(root.get(thirdAttribute), cb.literal(thirdValues))); List os = em.createQuery(cq.select(root).where(p)).getResultList(); List list = new ArrayList<>(os); return list; } public List listEqualAndEqualAndNotIn(Class cls, String firstAttribute, Object firstValue, String secondAttribute, Object secondValue, String thirdAttribute, Collection thirdValues) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(firstAttribute), firstValue); p = cb.and(p, cb.equal(root.get(secondAttribute), secondValue)); p = cb.and(p, cb.isNotMember(root.get(thirdAttribute), cb.literal(thirdValues))); List os = em.createQuery(cq.select(root).where(p)).getResultList(); List list = new ArrayList<>(os); return list; } public List listEqualAndInAndNotEqual(Class cls, String firstAttribute, Object firstValue, String secondAttribute, Collection secondValues, String thirdAttribute, Object thirdValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(firstAttribute), firstValue); p = cb.and(p, cb.isMember(root.get(secondAttribute), cb.literal(secondValues))); p = cb.and(p, cb.notEqual(root.get(thirdAttribute), thirdValue)); List os = em.createQuery(cq.select(root).where(p)).getResultList(); List list = new ArrayList<>(os); return list; } public List listEqualAndGreaterThanOrEqualTo(Class cls, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { EntityManager em = this.get(cls); Query query = em.createQuery("select o from " + cls.getName() + " o where ((o." + attribute + " = ?1) and (o." + otherAttribute + " >= ?2))"); query.setParameter(1, value); query.setParameter(2, otherValue); return new ArrayList(query.getResultList()); } public List listEqualAndLessThanOrEqualTo(Class cls, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(attribute), value); p = cb.and(p, cb.lessThanOrEqualTo(root.get(otherAttribute), (Comparable) otherValue)); List os = em.createQuery(cq.select(root).where(p)).getResultList(); return new ArrayList<>(os); } public List listBetweenAndEqual(Class cls, String attribute, Object start, Object end, String equalAttribute, Object equalValue) throws Exception { EntityManager em = this.get(cls); Query query = em.createQuery("select o from " + cls.getName() + " o where ((o." + attribute + " between ?1 and ?2) and (o." + equalAttribute + " = ?3))"); query.setParameter(1, start); query.setParameter(2, end); query.setParameter(3, equalValue); return new ArrayList(query.getResultList()); } public List listEqualOrIn(Class cls, String attribute, Object value, String otherAttribute, Collection otherValues) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); Predicate p = cb.equal(root.get(attribute), value); p = cb.or(p, cb.isMember(root.get(otherAttribute), cb.literal(otherValues))); List os = em.createQuery(cq.select(root).where(p)).getResultList(); List list = new ArrayList<>(os); return list; } public List listNotEqual(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.or(cb.isNull(root.get(attribute)), cb.notEqual(root.get(attribute), value))); List os = em.createQuery(cq).getResultList(); List list = new ArrayList<>(os); return list; } public List listIn(Class cls, String attribute, Collection values) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.isMember(root.get(attribute), cb.literal(values))); return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList())); } public List listIsMember(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.isMember(value, root.get(attribute))); List os = em.createQuery(cq).getResultList(); List list = new ArrayList<>(os); return list; } public Optional first(Class cls) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.isEmpty() ? Optional.empty() : Optional.of(os.get(0)); } public T firstEqual(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.equal(root.get(attribute), value)); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.isEmpty() ? null : os.get(0); } public T firstEqualAndEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root) .where(cb.and(cb.equal(root.get(attribute), value), cb.equal(root.get(otherAttribute), otherValue))); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.isEmpty() ? null : os.get(0); } public T firstEqualAndEqualAndEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue, String thirdAttribute, Object thirdValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root).where(cb.and(cb.equal(root.get(attribute), value), cb.equal(root.get(otherAttribute), otherValue), cb.equal(root.get(thirdAttribute), thirdValue))); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.isEmpty() ? null : os.get(0); } public T firstEqualOrEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root) .where(cb.or(cb.equal(root.get(attribute), value), cb.equal(root.get(otherAttribute), otherValue))); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.stream().findFirst().orElse(null); } public Optional firstEqualAndLessThanOrEqualTo(Class cls, String attribute, Object value, String otherAttribute, Comparable otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root) .where(cb.and(cb.equal(root.get(attribute), value), cb.lessThanOrEqualTo(root.get(otherAttribute), otherValue))) .orderBy(cb.desc(root.get(otherAttribute))); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.stream().findFirst(); } public Optional firstEqualAndLessThan(Class cls, String attribute, Object value, String otherAttribute, Comparable otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root) .where(cb.and(cb.equal(root.get(attribute), value), cb.lessThan(root.get(otherAttribute), otherValue))) .orderBy(cb.desc(root.get(otherAttribute))); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.stream().findFirst(); } public Optional firstEqualAndGreaterThanOrEqualTo(Class cls, String attribute, Object value, String otherAttribute, Comparable otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root) .where(cb.and(cb.equal(root.get(attribute), value), cb.greaterThanOrEqualTo(root.get(otherAttribute), otherValue))) .orderBy(cb.asc(root.get(otherAttribute))); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.stream().findFirst(); } public Optional firstEqualAndGreaterThan(Class cls, String attribute, Object value, String otherAttribute, Comparable otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(cls); Root root = cq.from(cls); cq.select(root) .where(cb.and(cb.equal(root.get(attribute), value), cb.greaterThan(root.get(otherAttribute), otherValue))) .orderBy(cb.asc(root.get(otherAttribute))); List os = em.createQuery(cq).setMaxResults(1).getResultList(); return os.stream().findFirst(); } public Long count(Class cls) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); return em.createQuery(cq.select(cb.count(root))).getSingleResult(); } public Long countGreaterThan(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); Query query = em .createQuery("select count(o) from " + cls.getName() + " o where (o." + attribute + " > " + "?1)"); query.setParameter(1, value); return (Long) query.getSingleResult(); } public Long countLessThan(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); Query query = em .createQuery("select count(o) from " + cls.getName() + " o where (o." + attribute + " < " + "?1)"); query.setParameter(1, value); return (Long) query.getSingleResult(); } public Long countGreaterThanOrEqualTo(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); Query query = em .createQuery("select count(o) from " + cls.getName() + " o where (o." + attribute + " >= " + "?1)"); query.setParameter(1, value); return (Long) query.getSingleResult(); } public Long countLessThanOrEqualTo(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); Query query = em .createQuery("select count(o) from " + cls.getName() + " o where (o." + attribute + " <= " + "?1)"); query.setParameter(1, value); return (Long) query.getSingleResult(); } public Long countEqual(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)).where(cb.equal(root.get(attribute), value)); return em.createQuery(cq).getSingleResult(); } public Long count(Class cls, Predicate predicate) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)).where(predicate); return em.createQuery(cq).getSingleResult(); } public Long countNotEqual(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)).where(cb.notEqual(root.get(attribute), value)); return em.createQuery(cq).getSingleResult(); } public Long countIsNull(Class cls, String attribute) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)).where(cb.isNull(root.get(attribute))); return em.createQuery(cq).getSingleResult(); } public Long countEqualAndEqual(Class cls, String euqalAttribute, Object equalValue, String otherEqualAttribute, Object otherEqualValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)).where(cb.and(cb.equal(root.get(euqalAttribute), equalValue), cb.equal(root.get(otherEqualAttribute), otherEqualValue))); return em.createQuery(cq).getSingleResult(); } public Long countEqualAndEqualAndEqual(Class cls, String oneEuqalAttribute, Object oneEqualValue, String twoEqualAttribute, Object twoEqualValue, String threeEqualAttribute, Object threeEqualValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)) .where(cb.and(cb.equal(root.get(oneEuqalAttribute), oneEqualValue), cb.equal(root.get(twoEqualAttribute), twoEqualValue), cb.equal(root.get(threeEqualAttribute), threeEqualValue))); return em.createQuery(cq).getSingleResult(); } public Long countEqualAndEqualAndNotEqual(Class cls, String euqalAttribute, Object equalValue, String otherEqualAttribute, Object otherEqualValue, String notEqualAttribute, Object notEqualValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)) .where(cb.and(cb.equal(root.get(euqalAttribute), equalValue), cb.equal(root.get(otherEqualAttribute), otherEqualValue), cb.notEqual(root.get(notEqualAttribute), notEqualValue))); return em.createQuery(cq).getSingleResult(); } public Long countEqualAndEqualAndEqualAndNotEqual(Class cls, String firstEuqalAttribute, Object firstEqualValue, String secondEqualAttribute, Object secondEqualValue, String thirdEqualAttribute, Object thirdEqualValue, String notEqualAttribute, Object notEqualValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)) .where(cb.and(cb.equal(root.get(firstEuqalAttribute), firstEqualValue), cb.equal(root.get(secondEqualAttribute), secondEqualValue), cb.equal(root.get(thirdEqualAttribute), thirdEqualValue), cb.notEqual(root.get(notEqualAttribute), notEqualValue))); return em.createQuery(cq).getSingleResult(); } public Long countEqualAndNotEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(cls); cq.select(cb.count(root)).where(cb.and(cb.equal(root.get(attribute), value), cb.or(cb.isNull(root.get(otherAttribute)), cb.notEqual(root.get(otherAttribute), otherValue)))); return em.createQuery(cq).getSingleResult(); } public List ids(Class cls) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); cq.select(root.get(JpaObject.id_FIELDNAME)); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } /* 仅在单一数据库可用 */ public List ids(Class cls, Predicate predicate) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); cq.select(root.get(JpaObject.id_FIELDNAME)).where(predicate); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } public List idsEqual(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.equal(root.get(attribute), value)); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } public List idsEqualAndEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.equal(root.get(attribute), value); p = cb.and(p, cb.equal(root.get(otherAttribute), otherValue)); cq.select(root.get(JpaObject.id_FIELDNAME)).where(p); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } public List idsEqualAndEqualAndEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue, String thirdAttribute, Object thirdValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.equal(root.get(attribute), value); p = cb.and(p, cb.equal(root.get(otherAttribute), otherValue)); p = cb.and(p, cb.equal(root.get(thirdAttribute), thirdValue)); cq.select(root.get(JpaObject.id_FIELDNAME)).where(p); List os = em.createQuery(cq).getResultList(); List list = new ArrayList<>(os); return list; } public List idsEqualAndEqualAndEqualAndNotEqual(Class cls, String firstAttribute, Object firstValue, String secondAttribute, Object secondValue, String thirdAttribute, Object thirdValue, String fourthAttribute, Object fourthValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.equal(root.get(firstAttribute), firstValue); p = cb.and(p, cb.equal(root.get(secondAttribute), secondValue)); p = cb.and(p, cb.equal(root.get(thirdAttribute), thirdValue)); p = cb.and(p, cb.notEqual(root.get(fourthAttribute), fourthValue)); cq.select(root.get(JpaObject.id_FIELDNAME)).where(p); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } public List idsEqualAndNotEqual(Class cls, String equalAttribute, Object equalValue, String notEqualAttribute, Object notEqualValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.equal(root.get(equalAttribute), equalValue); p = cb.and(p, cb.notEqual(root.get(notEqualAttribute), notEqualValue)); cq.select(root.get(JpaObject.id_FIELDNAME)).where(p); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } public List idsNotEqual(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.notEqual(root.get(attribute), value)); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } public List idsIn(Class cls, String attribute, Collection values) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.isMember(root.get(attribute), cb.literal(values))); return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList())); } public List idsNotIn(Class cls, String attribute, Collection values) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.not(root.get(attribute).in(values))); return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList())); } public List idsEqualAndNotIn(Class cls, String attribute, Collection values, String otherAttribute, Object otherValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.not(root.get(attribute).in(values)); p = cb.and(p, cb.equal(root.get(otherAttribute), otherValue)); cq.select(root.get(JpaObject.id_FIELDNAME)).where(p); return new ArrayList<>(em.createQuery(cq).getResultList().stream().distinct().collect(Collectors.toList())); } public List idsEqualAndIsMember(Class cls, String equalAttribute, Object equalValue, String isMemberAttribute, Object isMemberValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.equal(root.get(equalAttribute), equalValue); p = cb.and(p, cb.isMember(isMemberValue, root.get(isMemberAttribute))); cq.select(root.get(JpaObject.id_FIELDNAME)).where(p); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } public List idsIsMember(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); cq.select(root.get(JpaObject.id_FIELDNAME)).where(cb.isMember(value, root.get(attribute))); List os = em.createQuery(cq).getResultList(); return new ArrayList<>(os); } public List idsLessThan(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); String str = "SELECT o.id FROM " + cls.getCanonicalName() + " o where o." + attribute + " < ?1"; TypedQuery query = em.createQuery(str, String.class); query.setParameter(1, value); List os = query.getResultList(); return new ArrayList<>(os); } public List idsLessThanMax(Class cls, String attribute, Comparable value, Integer count) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.lessThan(root.get(attribute), (Comparable) value); List os = em.createQuery(cq.select(root.get(JpaObject.id_FIELDNAME)).where(p)).setMaxResults(count) .getResultList(); List list = new ArrayList<>(os); return list; } public List idsGreaterThan(Class cls, String attribute, Object value) throws Exception { EntityManager em = this.get(cls); String str = "SELECT o.id FROM " + cls.getCanonicalName() + " o where o." + attribute + " > ?1"; TypedQuery query = em.createQuery(str, String.class); query.setParameter(1, value); List os = query.getResultList(); return new ArrayList<>(os); } public List idsEqualAndIn(Class cls, String attribute, Object value, String otherAttribute, Collection otherValues) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.equal(root.get(attribute), value); p = cb.and(p, cb.isMember(root.get(otherAttribute), cb.literal(otherValues))); List os = em.createQuery(cq.select(root.get(JpaObject.id_FIELDNAME)).where(p)).getResultList(); return new ArrayList<>(os); } public List idsInOrInOrIn(Class cls, String firstAttribute, Collection firstCollection, String secondAttribute, Collection secondCollection, String thirdAttribute, Collection thirdCollection) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.or(root.get(firstAttribute).in(firstCollection), root.get(secondAttribute).in(secondCollection), root.get(thirdAttribute).in(thirdCollection)); List os = em.createQuery(cq.select(root.get(JpaObject.id_FIELDNAME)).where(p)).getResultList(); return new ArrayList<>(os); } public List idsInOrInOrIsMember(Class cls, String firstAttribute, Collection firstCollection, String secondAttribute, Collection secondCollection, String isMemberAttribute, Object isMemberValue) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); Predicate p = cb.or(root.get(firstAttribute).in(firstCollection), root.get(secondAttribute).in(secondCollection), cb.isMember(isMemberValue, root.get(isMemberAttribute))); List os = em.createQuery(cq.select(root.get(JpaObject.id_FIELDNAME)).where(p)).getResultList(); return new ArrayList<>(os); } public void commit() throws Exception { try { for (EntityManager em : entityManagerMap.values()) { if ((null != em) && em.getTransaction().isActive()) { em.getTransaction().commit(); } } } catch (Exception e) { throw new Exception("commit error", e); } } public void flush() throws Exception { try { for (EntityManager em : entityManagerMap.values()) { if ((null != em) && em.getTransaction().isActive()) { em.flush(); } } } catch (Exception e) { throw new Exception("flush error", e); } } public List fetchAll(Class clz) throws Exception { return this.fetchAll(clz, JpaObject.singularAttributeField(clz, true, true)); } public List fetchAll(Class clz, WrapCopier copier) throws Exception { return copier.copy(this.fetchAll(clz, copier.getCopyFields())); } public List fetchAll(Class clz, List attributes) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } for (Tuple o : em.createQuery(cq.multiselect(selections)).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, attributes.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public T fetch(String id, Class clz) throws Exception { return this.fetch(id, clz, JpaObject.singularAttributeField(clz, true, true)); } public T fetch(String id, Class clz, List attributes) throws Exception { T t = null; if (StringUtils.isEmpty(id)) { return null; } List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } cq.multiselect(selections).where(cb.equal(root.get(JpaObject.id_FIELDNAME), id)); List list = em.createQuery(cq).setMaxResults(1).getResultList(); if (!list.isEmpty()) { Tuple tuple = list.get(0); t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < selections.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), tuple.get(selections.get(i))); } } return t; } public T fetch(String id, Class clz, Class wrapClass) throws Exception { List list = new ArrayList<>(); for (Field field : FieldUtils.getAllFields(wrapClass)) { Field jpaField = FieldUtils.getField(clz, field.getName(), true); if ((null != jpaField) && (!Collection.class.isAssignableFrom(jpaField.getType()))) { list.add(field.getName()); } } return this.fetch(id, clz, list); } public W fetch(String id, WrapCopier copier) throws Exception { T t = this.fetch(id, copier.getOrigClass(), copier.getCopyFields()); return copier.copy(t); } public List fetch(Collection ids, Class clz) throws Exception { return this.fetch(ids, clz, JpaObject.singularAttributeField(clz, true, true)); } public List fetch(Collection ids, Class clz, List attributes) throws Exception { List list = new ArrayList<>(); if (ids.isEmpty()) { return list; } List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); List idList = new ArrayList<>(ids); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } cq.multiselect(selections).where(root.get(JpaObject.id_FIELDNAME).in(idList)); for (Tuple o : em.createQuery(cq).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } List ordering = new ArrayList<>(list); Collections.sort(ordering, (o1, o2) -> Integer.compare(idList.indexOf(o1.getId()), idList.indexOf(o2.getId()))); return ordering; } public List fetch(Collection ids, Class clz, Class wrapClass) throws Exception { List list = new ArrayList<>(); for (Field field : FieldUtils.getAllFields(wrapClass)) { Field jpaField = FieldUtils.getField(clz, field.getName(), true); if ((null != jpaField) && (!Collection.class.isAssignableFrom(jpaField.getType()))) { list.add(field.getName()); } } return this.fetch(ids, clz, list); } public List fetch(Collection ids, WrapCopier copier) throws Exception { List os = this.fetch(ids, copier.getOrigClass(), copier.getCopyFields()); return copier.copy(os); } /* 仅在单一数据库可用 */ public List fetch(Class clz, Predicate predicate) throws Exception { List os = fetch(clz, JpaObject.singularAttributeField(clz, true, true), predicate); return os; } /* 仅在单一数据库可用 */ public List fetch(Class clz, WrapCopier copier, Predicate predicate) throws Exception { List os = fetch(clz, copier.getCopyFields(), predicate); return copier.copy(os); } /* 仅在单一数据库可用 */ public List fetch(Class clz, List attributes, Predicate predicate) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } cq.multiselect(selections).where(predicate); T t = null; for (Tuple o : em.createQuery(cq).getResultList()) { t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public List fetchEqual(Class clz, String attribute, Object value) throws Exception { return this.fetchEqual(clz, JpaObject.singularAttributeField(clz, true, true), attribute, value); } public List fetchEqual(Class clz, WrapCopier copier, String attribute, Object value) throws Exception { List os = this.fetchEqual(clz, copier.getCopyFields(), attribute, value); return copier.copy(os); } public List fetchEqual(Class clz, List attributes, String attribute, Object value) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.equal(root.get(attribute), value); cq.multiselect(selections).where(p); for (Tuple o : em.createQuery(cq).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public List fetchEqualAndEqual(Class clz, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { return this.fetchEqualAndEqual(clz, JpaObject.singularAttributeField(clz, true, true), attribute, value, otherAttribute, otherValue); } public List fetchEqualAndEqual(Class clz, WrapCopier copier, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { List os = this.fetchEqualAndEqual(clz, copier.getCopyFields(), attribute, value, otherAttribute, otherValue); return copier.copy(os); } public List fetchEqualAndEqual(Class clz, List fetchAttributes, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.and(cb.equal(root.get(attribute), value), cb.equal(root.get(otherAttribute), otherValue)); cq.multiselect(selections).where(p); for (Tuple o : em.createQuery(cq).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public List fetchNotEqual(Class clz, String attribute, Object value) throws Exception { List os = this.fetchNotEqual(clz, JpaObject.singularAttributeField(clz, true, true), attribute, value); return os; } public List fetchNotEqual(Class clz, WrapCopier copier, String attribute, Object value) throws Exception { List os = this.fetchNotEqual(clz, copier.getCopyFields(), attribute, value); return copier.copy(os); } public List fetchNotEqual(Class clz, List attributes, String attribute, Object value) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.or(cb.isNull(root.get(attribute)), cb.notEqual(root.get(attribute), value)); cq.multiselect(selections).where(p); for (Tuple o : em.createQuery(cq).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public List fetchIn(Class clz, String attribute, Collection values) throws Exception { return this.fetchIn(clz, JpaObject.singularAttributeField(clz, true, true), attribute, values); } public List fetchIn(Class clz, WrapCopier copier, String attribute, Collection values) throws Exception { List os = this.fetchIn(clz, copier.getCopyFields(), attribute, values); return copier.copy(os); } public List fetchIn(Class clz, List attributes, String attribute, Collection values) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.isMember(root.get(attribute), cb.literal(values)); cq.multiselect(selections).where(p); for (Tuple o : em.createQuery(cq).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public List fetchEqualAndIn(Class clz, String attribute, Object value, String otherAttribute, Collection otherValues) throws Exception { return this.fetchEqualAndIn(clz, JpaObject.singularAttributeField(clz, true, true), attribute, value, otherAttribute, otherValues); } public List fetchEqualAndIn(Class clz, WrapCopier copier, String attribute, Object value, String otherAttribute, Collection otherValues) throws Exception { List os = this.fetchEqualAndIn(clz, copier.getCopyFields(), attribute, value, otherAttribute, otherValues); return copier.copy(os); } public List fetchEqualAndIn(Class clz, List fetchAttributes, String attribute, Object value, String otherAttribute, Collection otherValues) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.and(cb.equal(root.get(attribute), value), cb.isMember(root.get(otherAttribute), cb.literal(otherValues))); cq.multiselect(selections).where(p); for (Tuple o : em.createQuery(cq).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public List fetchIsMember(Class clz, String attribute, Object value) throws Exception { List os = this.fetchIsMember(clz, JpaObject.singularAttributeField(clz, true, true), attribute, value); return os; } public List fetchIsMember(Class clz, WrapCopier copier, String attribute, Object value) throws Exception { List os = this.fetchIsMember(clz, copier.getCopyFields(), attribute, value); return copier.copy(os); } public List fetchIsMember(Class clz, List attributes, String attribute, Object value) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.isMember(value, root.get(attribute)); cq.multiselect(selections).where(p); for (Tuple o : em.createQuery(cq).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public List fetchEuqalOrIsMember(Class clz, String equalAttribute, Object equalValue, String isMemberAttribute, Object isMemberValue) throws Exception { return this.fetchEuqalOrIsMember(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute, equalValue, isMemberAttribute, isMemberValue); } public List fetchEuqalOrIsMember(Class clz, WrapCopier copier, String equalAttribute, Object equalValue, String isMemberAttribute, Object isMemberValue) throws Exception { List os = this.fetchEuqalOrIsMember(clz, copier.getCopyFields(), equalAttribute, equalValue, isMemberAttribute, isMemberValue); return copier.copy(os); } public List fetchEuqalOrIsMember(Class clz, List attributes, String equalAttribute, Object equalValue, String isMemberAttribute, Object isMemberValue) throws Exception { List list = new ArrayList<>(); List fields = ListTools.trim(attributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.equal(root.get(equalAttribute), equalValue); p = cb.or(p, cb.isMember(isMemberValue, root.get(isMemberAttribute))); cq.multiselect(selections).where(p); for (Tuple o : em.createQuery(cq).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public Integer delete(Class clz, Collection ids) throws Exception { int i = 0; if (!ids.isEmpty()) { EntityManager em = this.get(clz); for (String id : ids) { if (StringUtils.isNotEmpty(id)) { T t = em.find(clz, id); if (null != t) { em.remove(t); i++; } } } } return i; } public Integer delete(Class clz, String... ids) throws Exception { return this.delete(clz, Arrays.asList(ids)); } public List deleteEqual(Class cls, String attribute, Object value) throws Exception { List os = this.listEqual(cls, attribute, value); os.stream().forEach(o -> { try { this.remove(o); } catch (Exception e) { e.printStackTrace(); } }); return os; } public List deleteEqualAndEqual(Class cls, String attribute, Object value, String otherAttribute, Object otherValue) throws Exception { List os = this.listEqualAndEqual(cls, attribute, value, otherAttribute, otherValue); os.stream().forEach(o -> { try { this.remove(o); } catch (Exception e) { e.printStackTrace(); } }); return os; } public boolean duplicateWithFlags(Class clz, String... value) throws Exception { List list = Arrays.asList(value); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(clz); Predicate p = cb.disjunction(); for (Field field : this.entityManagerContainerFactory.getFlagFields(clz)) { p = cb.or(p, root.get(field.getName()) .in(StringTools.filterLessThanOrEqualToUtf8Length(list, JpaObjectTools.definedLength(clz, field)))); } return em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult() > 0; } public boolean duplicateWithFlags(String excludeId, Class clz, String... value) throws Exception { List list = Arrays.asList(value); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(clz); Predicate p = cb.disjunction(); for (Field field : this.entityManagerContainerFactory.getFlagFields(clz)) { p = cb.or(p, root.get(field.getName()) .in(StringTools.filterLessThanOrEqualToUtf8Length(list, JpaObjectTools.definedLength(clz, field)))); } p = cb.and(p, cb.notEqual(root.get(JpaObject.id_FIELDNAME), excludeId)); return em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult() > 0; } public boolean duplicateWithFlags(List excludeIds, Class clz, String... value) throws Exception { List list = Arrays.asList(value); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(clz); Predicate p = cb.disjunction(); for (Field field : this.entityManagerContainerFactory.getFlagFields(clz)) { p = cb.or(p, root.get(field.getName()) .in(StringTools.filterLessThanOrEqualToUtf8Length(list, JpaObjectTools.definedLength(clz, field)))); } p = cb.and(p, cb.not(root.get(JpaObject.id_FIELDNAME).in(excludeIds))); return em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult() > 0; } public boolean duplicateWithRestrictFlags(Class clz, String restrictSingularAttribute, Object restrictValue, String excludeId, List values) throws Exception { values = ListTools.trim(values, true, true); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(clz); Predicate p = cb.disjunction(); for (Field field : this.entityManagerContainerFactory.getFlagFields(clz)) { p = cb.or(p, root.get(field.getName()).in(StringTools.filterLessThanOrEqualToUtf8Length(values, JpaObjectTools.definedLength(clz, field.getName())))); } if (StringUtils.isNotEmpty(excludeId)) { p = cb.and(p, cb.notEqual(root.get(JpaObject.id_FIELDNAME), excludeId)); } return em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult() > 0; } public List select(Class cls, String attribute, Class attributeClass) throws Exception { EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(attributeClass); Root root = cq.from(cls); List os = em.createQuery(cq.select(root.get(attribute))).getResultList(); List list = new ArrayList<>(os); return list; } public String conflict(Class clz, T t) throws Exception { EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); for (Field field : this.entityManagerContainerFactory.getFlagFields(clz)) { Object value = t.get(field.getName()); if ((null != value) && StringUtils.isNotEmpty(Objects.toString(value))) { CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(clz); Predicate p = cb.disjunction(); for (Field f : this.entityManagerContainerFactory.getFlagFields(clz)) { p = cb.or(p, cb.equal(root.get(f.getName()), value)); } p = cb.and(p, cb.notEqual(root.get(JpaObject.id_FIELDNAME), t.getId())); if (em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult() > 0) { return field.getName() + ":" + Objects.toString(value); } } } for (Field field : this.entityManagerContainerFactory.getRestrictFlagFields(clz)) { Object value = t.get(field.getName()); if ((null != value) && StringUtils.isNotEmpty(Objects.toString(value))) { RestrictFlag restrictFlag = field.getAnnotation(RestrictFlag.class); if ((null != restrictFlag) && restrictFlag.fields().length > 0) { CriteriaQuery cq = cb.createQuery(Long.class); Root root = cq.from(clz); Predicate p = cb.disjunction(); for (Field f : this.entityManagerContainerFactory.getFlagFields(clz)) { Object v = t.get(f.getName()); if ((null != v) && StringUtils.isNotEmpty(Objects.toString(v))) { p = cb.or(cb.equal(root.get(f.getName()), v)); } } p = cb.and(p, cb.equal(root.get(field.getName()), value)); p = cb.and(p, cb.notEqual(root.get(JpaObject.id_FIELDNAME), t.getId())); if (em.createQuery(cq.select(cb.count(root)).where(p)).getSingleResult() > 0) { return field.getName() + ":" + Objects.toString(value); } } } } return null; } public List listEqualAndSequenceAfter(Class clz, String equalAttribute, Object equalValue, Integer count, String sequence) throws Exception { EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(clz); Root root = cq.from(clz); Predicate p = cb.equal(root.get(equalAttribute), equalValue); if (StringUtils.isNotEmpty(sequence)) { p = cb.and(p, cb.greaterThan(root.get(JpaObject.sequence_FIELDNAME), sequence)); } cq.select(root).where(p).orderBy(cb.asc(root.get(JpaObject.sequence_FIELDNAME))); List os = em.createQuery(cq).setMaxResults((count != null && count > 0) ? count : 100).getResultList(); List list = new ArrayList<>(os); return list; } public List listEqualAndEqualAndSequenceAfter(Class clz, String oneEqualAttribute, Object oneEqualValue, String twoEqualAttribute, Object twoEqualValue, Integer count, String sequence) throws Exception { EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(clz); Root root = cq.from(clz); Predicate p = cb.equal(root.get(oneEqualAttribute), oneEqualValue); p = cb.and(p, cb.equal(root.get(twoEqualAttribute), twoEqualValue)); if (StringUtils.isNotEmpty(sequence)) { p = cb.and(p, cb.greaterThan(root.get(JpaObject.sequence_FIELDNAME), sequence)); } cq.select(root).where(p).orderBy(cb.asc(root.get(JpaObject.sequence_FIELDNAME))); List os = em.createQuery(cq).setMaxResults((count != null && count > 0) ? count : 100).getResultList(); List list = new ArrayList<>(os); return list; } public List listSequenceAfter(Class clz, Integer count, String sequence) throws Exception { EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(clz); Root root = cq.from(clz); Predicate p = cb.conjunction(); if (StringUtils.isNotEmpty(sequence)) { p = cb.greaterThan(root.get(JpaObject.sequence_FIELDNAME), sequence); } cq.select(root).where(p).orderBy(cb.asc(root.get(JpaObject.sequence_FIELDNAME))); List os = em.createQuery(cq).setMaxResults((count != null && count > 0) ? count : 100).getResultList(); List list = new ArrayList<>(os); return list; } /* 仅在单一数据库可用 */ public List fetchDescPaging(Class clz, Predicate predicate, Integer page, Integer count, String orderAttribute) throws Exception { List os = fetchDescPaging(clz, JpaObject.singularAttributeField(clz, true, true), predicate, page, count, orderAttribute); return os; } /* 仅在单一数据库可用 */ public List fetchDescPaging(Class clz, WrapCopier copier, Predicate predicate, Integer page, Integer count, String orderAttribute) throws Exception { List os = fetchDescPaging(clz, copier.getCopyFields(), predicate, page, count, orderAttribute); return copier.copy(os); } /* 仅在单一数据库可用 */ public List fetchDescPaging(Class clz, List fetchAttributes, Predicate predicate, Integer page, Integer pageSize, String orderAttribute) throws Exception { List list = new ArrayList<>(); int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize; int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max; List fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } cq.multiselect(selections).where(predicate).orderBy(cb.desc(root.get(orderAttribute))); T t = null; for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) { t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } /* 仅在单一数据库可用 */ public List fetchAscPaging(Class clz, Predicate predicate, Integer page, Integer count, String orderAttribute) throws Exception { List os = fetchAscPaging(clz, JpaObject.singularAttributeField(clz, true, true), predicate, page, count, orderAttribute); return os; } /* 仅在单一数据库可用 */ public List fetchAscPaging(Class clz, WrapCopier copier, Predicate predicate, Integer page, Integer count, String orderAttribute) throws Exception { List os = fetchAscPaging(clz, copier.getCopyFields(), predicate, page, count, orderAttribute); return copier.copy(os); } /* 仅在单一数据库可用 */ public List fetchAscPaging(Class clz, List fetchAttributes, Predicate predicate, Integer page, Integer pageSize, String orderAttribute) throws Exception { List list = new ArrayList<>(); int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize; int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max; List fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } cq.multiselect(selections).where(predicate).orderBy(cb.asc(root.get(orderAttribute))); T t = null; for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) { t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } /* 仅在单一数据库可用 */ public List fetchEqualAscPaging(Class clz, WrapCopier copier, String equalAttribute, Object equalValue, Integer page, Integer count, String orderAttribute) throws Exception { List os = fetchEqualAscPaging(clz, copier.getCopyFields(), equalAttribute, equalValue, page, count, orderAttribute); return copier.copy(os); } /* 仅在单一数据库可用 */ public List fetchEqualAscPaging(Class clz, String equalAttribute, Object equalValue, Integer page, Integer count, String orderAttribute) throws Exception { return fetchEqualAscPaging(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute, equalValue, page, count, orderAttribute); } /* 仅在单一数据库可用 */ public List fetchEqualAscPaging(Class clz, List fetchAttributes, String equalAttribute, Object equalValue, Integer page, Integer pageSize, String orderAttribute) throws Exception { List list = new ArrayList<>(); int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize; int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max; List fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.equal(root.get(equalAttribute), equalValue); cq.multiselect(selections).where(p).orderBy(cb.asc(root.get(orderAttribute))); for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } /* 仅在单一数据库可用 */ public List fetchEqualDescPaging(Class clz, WrapCopier copier, String equalAttribute, Object equalValue, Integer page, Integer count, String orderAttribute) throws Exception { List os = fetchEqualDescPaging(clz, copier.getCopyFields(), equalAttribute, equalValue, page, count, orderAttribute); return copier.copy(os); } /* 仅在单一数据库可用 */ public List fetchEqualDescPaging(Class clz, String equalAttribute, Object equalValue, Integer page, Integer count, String orderAttribute) throws Exception { return fetchEqualDescPaging(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute, equalValue, page, count, orderAttribute); } /* 仅在单一数据库可用 */ public List fetchEqualDescPaging(Class clz, List fetchAttributes, String equalAttribute, Object equalValue, Integer page, Integer pageSize, String orderAttribute) throws Exception { List list = new ArrayList<>(); int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize; int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max; List fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.equal(root.get(equalAttribute), equalValue); cq.multiselect(selections).where(p).orderBy(cb.desc(root.get(orderAttribute))); for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } /* 仅在单一数据库可用 */ public List fetchEqualAndEqualDescPaging(Class clz, WrapCopier copier, String equalAttribute, Object equalValue, String otherEqualAttribute, Object otherEqualValue, Integer page, Integer count, String orderAttribute) throws Exception { List os = fetchEqualAndEqualDescPaging(clz, copier.getCopyFields(), equalAttribute, equalValue, otherEqualAttribute, otherEqualValue, page, count, orderAttribute); return copier.copy(os); } /* 仅在单一数据库可用 */ public List fetchEqualAndEqualDescPaging(Class clz, String equalAttribute, Object equalValue, String otherEqualAttribute, Object otherEqualValue, Integer page, Integer count, String orderAttribute) throws Exception { return fetchEqualAndEqualDescPaging(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute, equalValue, otherEqualAttribute, otherEqualValue, page, count, orderAttribute); } /* 仅在单一数据库可用 */ public List fetchEqualAndEqualDescPaging(Class clz, List fetchAttributes, String equalAttribute, Object equalValue, String otherEqualAttribute, Object otherEqualValue, Integer page, Integer pageSize, String orderAttribute) throws Exception { List list = new ArrayList<>(); int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize; int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max; List fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.equal(root.get(equalAttribute), equalValue); p = cb.and(p, cb.equal(root.get(otherEqualAttribute), otherEqualValue)); cq.multiselect(selections).where(p).orderBy(cb.desc(root.get(orderAttribute))); for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } /* 仅在单一数据库可用 */ public List fetchEqualAndNotEqualDescPaging(Class clz, WrapCopier copier, String equalAttribute, Object equalValue, String otherNotEqualAttribute, Object otherNotEqualValue, Integer page, Integer count, String orderAttribute) throws Exception { List os = fetchEqualAndNotEqualDescPaging(clz, copier.getCopyFields(), equalAttribute, equalValue, otherNotEqualAttribute, otherNotEqualValue, page, count, orderAttribute); return copier.copy(os); } /* 仅在单一数据库可用 */ public List fetchEqualAndNotEqualDescPaging(Class clz, String equalAttribute, Object equalValue, String otherNotEqualAttribute, Object otherNotEqualValue, Integer page, Integer count, String orderAttribute) throws Exception { return fetchEqualAndNotEqualDescPaging(clz, JpaObject.singularAttributeField(clz, true, true), equalAttribute, equalValue, otherNotEqualAttribute, otherNotEqualValue, page, count, orderAttribute); } /* 仅在单一数据库可用 */ public List fetchEqualAndNotEqualDescPaging(Class clz, List fetchAttributes, String equalAttribute, Object equalValue, String otherNotEqualAttribute, Object otherNotEqualValue, Integer page, Integer pageSize, String orderAttribute) throws Exception { List list = new ArrayList<>(); int max = (pageSize == null || pageSize < 1 || pageSize > MAX_PAGESIZE) ? DEFAULT_PAGESIZE : pageSize; int startPosition = (page == null || page < 1) ? 0 : (page - 1) * max; List fields = ListTools.trim(fetchAttributes, true, true, JpaObject.id_FIELDNAME); EntityManager em = this.get(clz); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(Tuple.class); Root root = cq.from(clz); List> selections = new ArrayList<>(); for (String str : fields) { selections.add(root.get(str)); } Predicate p = cb.equal(root.get(equalAttribute), equalValue); p = cb.and(p, cb.notEqual(root.get(otherNotEqualAttribute), otherNotEqualValue)); cq.multiselect(selections).where(p).orderBy(cb.desc(root.get(orderAttribute))); for (Tuple o : em.createQuery(cq).setFirstResult(startPosition).setMaxResults(max).getResultList()) { T t = clz.getDeclaredConstructor().newInstance(); for (int i = 0; i < fields.size(); i++) { PropertyUtils.setProperty(t, fields.get(i), o.get(selections.get(i))); } list.add(t); } return list; } public Long clean(Class cls, Integer batchSize) throws Exception { Long count = 0L; EntityManager em = this.get(cls); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery cq = cb.createQuery(String.class); Root root = cq.from(cls); cq.select(root.get(JpaObject.id_FIELDNAME)); List ids; do { ids = em.createQuery(cq).setMaxResults(NumberTools.nullOrLessThan(batchSize, 1) ? 500 : batchSize) .getResultList(); if (!ids.isEmpty()) { em.getTransaction().begin(); for (String id : ids) { T t = em.find(cls, id); if (null != t) { em.remove(t); count++; } } em.getTransaction().commit(); } } while (!ids.isEmpty()); return count; } }