BaseJpaService.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. package com.yihu.ehr.query;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import com.yihu.ehr.constants.PageArg;
  4. import com.yihu.ehr.lang.SpringContext;
  5. import org.apache.commons.lang3.StringUtils;
  6. import org.hibernate.Query;
  7. import org.hibernate.Session;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.data.domain.Sort;
  10. import org.springframework.data.jpa.repository.JpaRepository;
  11. import org.springframework.data.repository.PagingAndSortingRepository;
  12. import org.springframework.jdbc.core.JdbcTemplate;
  13. import org.springframework.transaction.annotation.Propagation;
  14. import org.springframework.transaction.annotation.Transactional;
  15. import javax.persistence.EntityManager;
  16. import javax.persistence.PersistenceContext;
  17. import javax.persistence.criteria.CriteriaBuilder;
  18. import javax.persistence.criteria.CriteriaQuery;
  19. import javax.persistence.criteria.Predicate;
  20. import javax.persistence.criteria.Root;
  21. import javax.persistence.metamodel.EntityType;
  22. import java.io.Serializable;
  23. import java.lang.reflect.ParameterizedType;
  24. import java.lang.reflect.Type;
  25. import java.text.ParseException;
  26. import java.util.*;
  27. /**
  28. * Service基础类。此类基于Spring Data JPA进行封装(Spring Data JPA又是基于JPA封装,EHR平台使用Hibernate作为JPA实现者)。
  29. * 需要注意的是,部分功能会跳过JPA接口而直接使用Hibernate接口,比如访问Hibernate的Session接口,因为它把JPA的EntityManager功能强大。
  30. *
  31. * @author lincl
  32. * @author Sand
  33. * @version 1.0
  34. * @created 2016.2.3。
  35. */
  36. @Transactional(propagation = Propagation.SUPPORTS)
  37. public class BaseJpaService<T, R> {
  38. @PersistenceContext
  39. protected EntityManager entityManager;
  40. @Autowired
  41. protected JdbcTemplate jdbcTemplate;
  42. @Autowired
  43. protected ObjectMapper objectMapper;
  44. Class<R> repoClass;
  45. public BaseJpaService() {
  46. Type genType = getClass().getGenericSuperclass();
  47. if ((genType instanceof ParameterizedType)) {
  48. Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
  49. if (params.length == 2) {
  50. repoClass = (Class) params[1];
  51. }
  52. }
  53. }
  54. public T save(T entity) {
  55. return (T) getRepository().save(entity);
  56. }
  57. public T retrieve(Serializable id) {
  58. return (T) getRepository().findOne(id);
  59. }
  60. public void delete(Serializable id) {
  61. getRepository().delete(id);
  62. }
  63. public void delete(T entity) {
  64. getRepository().delete(entity);
  65. }
  66. public void delete(Iterable ids) {
  67. Iterable list = getRepository().findAll(ids);
  68. getRepository().delete(list);
  69. }
  70. public Class<T> getEntityClass() {
  71. Type genType = this.getClass().getGenericSuperclass();
  72. Type[] parameters = ((ParameterizedType) genType).getActualTypeArguments();
  73. return (Class) parameters[0];
  74. }
  75. public List<T> search(String fields, String filters, String sorts, Integer page, Integer size) throws ParseException {
  76. URLQueryParser queryParser = createQueryParser(fields, filters, sorts);
  77. CriteriaQuery query = queryParser.makeCriteriaQuery();
  78. if (page == null || page <= 0) {
  79. page = PageArg.DefaultPage;
  80. }
  81. if (size == null || size <= 0 || size > 10000) {
  82. size = PageArg.DefaultSize;
  83. }
  84. List resultList = entityManager
  85. .createQuery(query)
  86. .setFirstResult((page - 1) * size)
  87. .setMaxResults(size)
  88. .getResultList();
  89. return (List<T>) resultList;
  90. }
  91. public List<T> search(String filters) throws ParseException {
  92. URLQueryParser queryParser = createQueryParser("", filters, "");
  93. CriteriaQuery query = queryParser.makeCriteriaQuery();
  94. List resultList = entityManager
  95. .createQuery(query)
  96. .getResultList();
  97. return (List<T>) resultList;
  98. }
  99. public List<T> search(String filters, String sorts) throws ParseException {
  100. URLQueryParser queryParser = createQueryParser("", filters, sorts);
  101. CriteriaQuery query = queryParser.makeCriteriaQuery();
  102. List resultList = entityManager
  103. .createQuery(query)
  104. .getResultList();
  105. return (List<T>) resultList;
  106. }
  107. public long getCount(String filters) throws ParseException {
  108. URLQueryParser queryParser = createQueryParser(filters);
  109. CriteriaQuery query = queryParser.makeCriteriaCountQuery();
  110. return (long) entityManager.createQuery(query).getSingleResult();
  111. }
  112. public PagingAndSortingRepository getRepository() {
  113. return (PagingAndSortingRepository) SpringContext.getService(repoClass);
  114. }
  115. public JpaRepository getJpaRepository() {
  116. return (JpaRepository) SpringContext.getService(repoClass);
  117. }
  118. public List<T> findByField(String field, Object value) {
  119. return findByFields(
  120. new String[]{field},
  121. new Object[]{value}
  122. );
  123. }
  124. public List<T> findByFields(String[] fields, Object[] values) {
  125. CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
  126. CriteriaQuery query = criteriaBuilder.createQuery(getEntityClass());
  127. Root<T> root = query.from(getEntityClass());
  128. List<Predicate> ls = new ArrayList<>();
  129. for (int i = 0; i < fields.length; i++) {
  130. if (values[i].getClass().isArray()) {
  131. ls.add(criteriaBuilder.in(root.get(fields[i]).in((Object[]) values[i])));
  132. } else {
  133. ls.add(criteriaBuilder.equal(root.get(fields[i]), values[i]));
  134. }
  135. }
  136. query.where(ls.toArray(new Predicate[ls.size()]));
  137. List resultList = entityManager
  138. .createQuery(query)
  139. .getResultList();
  140. return (List<T>) resultList;
  141. }
  142. public String getClzName() {
  143. return getEntityClass().getName();
  144. }
  145. public String getEntityIdFiled() {
  146. EntityType entityType = entityManager.getMetamodel().entity(getEntityClass());
  147. javax.persistence.metamodel.Type type = entityType.getIdType();
  148. String s = entityType.getId(type.getJavaType()).getName();
  149. return s;
  150. }
  151. public int delete(Object[] ids) {
  152. String hql = " DELETE FROM " + getEntityClass().getName() + " WHERE " + getEntityIdFiled() + " in(:ids)";
  153. Query query = currentSession().createQuery(hql);
  154. query.setParameterList("ids", ids);
  155. return query.executeUpdate();
  156. }
  157. public void batchInsert(List list) {
  158. for (int i = 0; i < list.size(); i++) {
  159. entityManager.persist(list.get(i));
  160. if (i % 30 == 0) {
  161. entityManager.flush();
  162. entityManager.clear();
  163. }
  164. }
  165. }
  166. public String getCode() {
  167. return UUID.randomUUID().toString().replaceAll("-", "");
  168. }
  169. protected <t> URLQueryParser createQueryParser(String fields, String filters, String orders) {
  170. return new URLQueryParser<t>(fields, filters, orders)
  171. .setEntityManager(entityManager)
  172. .setEntityClass(getEntityClass());
  173. }
  174. protected <t> URLQueryParser createQueryParser(String filters) {
  175. return new URLQueryParser<t>(filters)
  176. .setEntityManager(entityManager)
  177. .setEntityClass(getEntityClass());
  178. }
  179. protected Sort parseSorts(String sorter) {
  180. if (StringUtils.isNotEmpty(sorter)) {
  181. String[] orderArray = sorter.split(",");
  182. List<Sort.Order> orderList = new ArrayList<>(orderArray.length);
  183. Arrays.stream(orderArray).forEach(
  184. elem -> orderList.add(
  185. elem.startsWith("+") ? new Sort.Order(Sort.Direction.ASC, elem.substring(1)) :
  186. new Sort.Order(Sort.Direction.DESC, elem.substring(1))));
  187. return new Sort(orderList);
  188. }
  189. return null;
  190. }
  191. protected Session currentSession() {
  192. return entityManager.unwrap(Session.class);
  193. }
  194. /**
  195. * 获取指定长度的随机字符串
  196. * @param length
  197. * @return
  198. */
  199. protected String getRandomString(int length) {
  200. String str = "abcdefghigklmnopkrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ0123456789";
  201. StringBuffer buffer = new StringBuffer();
  202. Random random = new Random();
  203. for (int i = 0; i < length; i++) {
  204. int number = random.nextInt(str.length() - 1);//0~61
  205. buffer.append(str.charAt(number));
  206. }
  207. return buffer.toString();
  208. }
  209. }