DAOServiceImpl.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. /*
  2. * Copyright 2009 by primedata Corporation.
  3. * ,
  4. *
  5. * All rights reserved.
  6. *
  7. * This software is the confidential and proprietary information of
  8. * primedata Corporation ("Confidential Information"). You
  9. * shall not disclose such Confidential Information and shall use
  10. * it only in accordance with the terms of the license agreement
  11. * you entered into with primedata.
  12. */
  13. package com.primeton.dams.utils.template.impl;
  14. import com.primeton.dams.utils.template.CoreSQLParser;
  15. import com.primeton.dams.utils.template.HibernateStatementSessionFactoryBean;
  16. import com.primeton.dams.utils.template.IDAOService;
  17. import com.primeton.dams.utils.template.Page;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.apache.commons.lang.StringUtils;
  20. import org.hibernate.SQLQuery;
  21. import org.hibernate.transform.ResultTransformer;
  22. import org.hibernate.transform.Transformers;
  23. import org.slf4j.Logger;
  24. import org.slf4j.LoggerFactory;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.dao.DataAccessException;
  27. import org.springframework.jdbc.core.JdbcTemplate;
  28. import org.springframework.stereotype.Repository;
  29. import javax.persistence.EntityManager;
  30. import javax.persistence.LockModeType;
  31. import javax.persistence.NoResultException;
  32. import javax.persistence.NonUniqueResultException;
  33. import javax.persistence.PersistenceContext;
  34. import javax.persistence.Query;
  35. import java.io.Serializable;
  36. import java.util.ArrayList;
  37. import java.util.Collection;
  38. import java.util.HashMap;
  39. import java.util.Iterator;
  40. import java.util.List;
  41. import java.util.Map;
  42. /**
  43. * find开头的方法是HQL方法,query开头的是SQL方法。
  44. * @author user
  45. * @version 1.0 2007-1-27
  46. *
  47. * @author zhaopx
  48. * @version 7.1
  49. * @date 2020-08-25
  50. */
  51. @Slf4j
  52. @Repository(value = "daoService")
  53. public class DAOServiceImpl implements IDAOService {
  54. /**
  55. * LOG
  56. */
  57. private static Logger logger = LoggerFactory.getLogger(DAOServiceImpl.class);
  58. @Autowired
  59. JdbcTemplate jdbcTemplate;
  60. @PersistenceContext
  61. EntityManager entityManager;
  62. @Override
  63. public JdbcTemplate getJdbcTemplate() {
  64. return jdbcTemplate;
  65. }
  66. public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  67. this.jdbcTemplate = jdbcTemplate;
  68. }
  69. public DAOServiceImpl() {
  70. super();
  71. }
  72. /** Get HQL from xxxSql.xml file*/
  73. @Override
  74. public String getSQL(String name) {
  75. return HibernateStatementSessionFactoryBean.getStatementText(name);
  76. }
  77. /** Get dynamic HQL from xxxSql.xml file, voOrMap is a VO or a map.*/
  78. @Override
  79. public String getSQL(String name, Object voOrMap) {
  80. return HibernateStatementSessionFactoryBean.getStatementText(name, voOrMap);
  81. }
  82. /** Get dynamic Params from xxxSql.xml file, voOrMap is a VO or a map.*/
  83. @Override
  84. public Object[] getParam(String name, Object voOrMap) {
  85. return HibernateStatementSessionFactoryBean.getStatementParam(name, voOrMap);
  86. }
  87. /** Get dynamic Params from xxxSql.xml file, voOrMap is a VO or a map.*/
  88. @Override
  89. public Map getMapParam(String name, Object voOrMap) {
  90. return HibernateStatementSessionFactoryBean.getStatementParamMap(name, voOrMap);
  91. }
  92. //Persist the given transient instance
  93. @Override
  94. public void add(Object vo) throws DataAccessException {
  95. entityManager.persist(vo);
  96. }
  97. //Update the given persistent instance
  98. @Override
  99. public void update(Object vo) throws DataAccessException {
  100. entityManager.merge(vo);
  101. }
  102. @Override
  103. public void merge(Object entity) throws DataAccessException {
  104. entityManager.merge(entity);
  105. }
  106. //Save or update the given persistent instance, according to its id
  107. @Override
  108. public void addOrUpdate(Object vo) throws DataAccessException {
  109. entityManager.persist(vo);
  110. }
  111. @Override
  112. public void addAll(Collection vos) throws DataAccessException {
  113. for (Object vo : vos) {
  114. entityManager.persist(vo);
  115. }
  116. }
  117. //Return the persistent instance of the given entity class with the given identifier,
  118. //or null if not found
  119. @Override
  120. public Object get(Class entityClass, Serializable id) {
  121. return entityManager.find(entityClass, id);
  122. }
  123. //Return the persistent instance of the given entity class with the given identifier,
  124. //or null if not found
  125. @Override
  126. public Object get(Class entityClass, Serializable id, LockModeType lockMode) {
  127. return entityManager.find(entityClass, id, lockMode);
  128. }
  129. //Delete the given persistent instance, according to its id
  130. @Override
  131. public void delete(Class entityClass, Serializable id) throws DataAccessException {
  132. entityManager.remove(get(entityClass, id));
  133. }
  134. //Delete the given persistent instance
  135. @Override
  136. public void delete(Object entity) throws DataAccessException {
  137. entityManager.remove(entity);
  138. }
  139. //Delete all given persistent instances
  140. @Override
  141. public void deleteAll(Collection entities) throws DataAccessException {
  142. for (Object entity : entities) {
  143. entityManager.remove(entity);
  144. }
  145. }
  146. //Update/delete all objects according to the given query
  147. @Override
  148. public int execute(String updateSql) {
  149. return entityManager.createNativeQuery(updateSql).executeUpdate();
  150. }
  151. //Update/delete all objects according to the given query
  152. @Override
  153. public int execute(String updateSql, Object[] params) {
  154. final javax.persistence.Query nativeQuery = entityManager.createNativeQuery(updateSql);
  155. for (int i = 0; params != null && i < params.length; i++) {
  156. nativeQuery.setParameter(i, params[i]);
  157. }
  158. return nativeQuery.executeUpdate();
  159. }
  160. //flush session
  161. @Override
  162. public void flush() {
  163. entityManager.flush();
  164. }
  165. //clear session
  166. @Override
  167. public void clear() {
  168. entityManager.clear();
  169. }
  170. // count(*).
  171. @Override
  172. public int count(String queryString, Object[] values) {
  173. return countSQL(queryString, values);
  174. }
  175. /**
  176. * 执行SQL查询。提供结果集的转换接口ResultTransformer。
  177. * @param query
  178. * @param params
  179. * @param rt
  180. * @param firstResult
  181. * @param maxResult
  182. * @return
  183. */
  184. @Override
  185. public List query(javax.persistence.Query query, Object[] params, ResultTransformer rt, final int firstResult, final int maxResult) {
  186. for (int i=0; params!=null && i<params.length; i++) {
  187. query.setParameter(i, params[i]);
  188. }
  189. query.setMaxResults(maxResult);
  190. query.setFirstResult(firstResult);
  191. if (rt == null) {
  192. query.unwrap(org.hibernate.SQLQuery.class)
  193. .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  194. } else {
  195. query.unwrap(org.hibernate.SQLQuery.class)
  196. .setResultTransformer(rt);
  197. }
  198. return query.getResultList();
  199. }
  200. @Override
  201. public List query(javax.persistence.Query query, Object[] params, ResultTransformer rt) {
  202. for (int i=0; params!=null && i<params.length; i++) {
  203. query.setParameter(i, params[i]);
  204. }
  205. if (rt == null) {
  206. query.unwrap(org.hibernate.SQLQuery.class)
  207. .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  208. } else {
  209. query.unwrap(org.hibernate.SQLQuery.class)
  210. .setResultTransformer(rt);
  211. }
  212. return query.getResultList();
  213. }
  214. @Override
  215. public List query(String sql, Object[] params, ResultTransformer rt) {
  216. return query(entityManager.createNativeQuery(sql), params, rt);
  217. }
  218. /**
  219. * 执行SQL查询
  220. * @param id 脚本
  221. * @param params 参数
  222. * @param entityClass 转换
  223. * @return Object[]/Object
  224. */
  225. @Override
  226. public List queryById(String id, Map<String, Object> params, Class entityClass) {
  227. final String sql = getSQL(id);
  228. if(StringUtils.isBlank(sql)) {
  229. throw new IllegalArgumentException("undefined statement id: " + id);
  230. }
  231. final Object[] sqlParams = (params == null ? null : getParam(id, params));
  232. final Query nativeQuery = entityClass == null ? entityManager.createNativeQuery(sql) : entityManager.createNativeQuery(sql, entityClass);
  233. if (entityClass == null) {
  234. nativeQuery.unwrap(org.hibernate.SQLQuery.class)
  235. .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  236. }
  237. return query(nativeQuery, sqlParams, entityClass, null, null);
  238. }
  239. /**
  240. * 执行 statement id 的查询,返回 ResultTransformer 的转换结果, 并应用分页
  241. * @param id
  242. * @param params
  243. * @param entityClass
  244. * @param firstResult
  245. * @param maxResult
  246. * @return
  247. */
  248. @Override
  249. public List queryById(String id, Map<String, Object> params, Class entityClass, final int firstResult, final int maxResult) {
  250. final String sql = getSQL(id);
  251. if(StringUtils.isBlank(sql)) {
  252. throw new IllegalArgumentException("undefined statement id: " + id);
  253. }
  254. final Object[] sqlParams = (params == null ? null : getParam(id, params));
  255. final Query nativeQuery = entityClass == null ? entityManager.createNativeQuery(sql) : entityManager.createNativeQuery(sql, entityClass);
  256. if (entityClass == null) {
  257. nativeQuery.unwrap(org.hibernate.SQLQuery.class)
  258. .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  259. }
  260. return query(nativeQuery, sqlParams, entityClass, firstResult, maxResult);
  261. }
  262. private List query(javax.persistence.Query query, Object[] params, Class entityClass, final Integer firstResult, final Integer maxResult) {
  263. for (int i = 0; params != null && i < params.length; i++) {
  264. query.setParameter(i, params[i]);
  265. }
  266. if (firstResult != null) {
  267. query.setFirstResult(firstResult);
  268. }
  269. if (maxResult != null) {
  270. query.setMaxResults(maxResult);
  271. }
  272. return query.getResultList();
  273. }
  274. @Override
  275. public List querySQL(javax.persistence.Query query, Object[] params) {
  276. return this.query(query, params, null);
  277. }
  278. @Override
  279. public List queryForMap(String sql, Object[] params) {
  280. return this.query(sql, params, Transformers.ALIAS_TO_ENTITY_MAP);
  281. }
  282. @Override
  283. public List queryForMap(javax.persistence.Query query, Object[] params) {
  284. return this.query(query, params, Transformers.ALIAS_TO_ENTITY_MAP);
  285. }
  286. @Override
  287. public List queryForMap(String sql, Object[] params, int firstResult, int maxResult) {
  288. final javax.persistence.Query query1 = entityManager.createNativeQuery(sql);
  289. for (int i = 0; params != null && i < params.length; i++) {
  290. query1.setParameter(i, params[i]);
  291. }
  292. query1.setFirstResult(firstResult);
  293. query1.setMaxResults(maxResult);
  294. query1.unwrap(org.hibernate.SQLQuery.class)
  295. .setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
  296. return query1.getResultList();
  297. }
  298. private List queryForEntity(javax.persistence.Query query, Object[] params, Class entityClass) {
  299. for (int i = 0; params != null && i < params.length; i++) {
  300. query.setParameter(i, params[i]);
  301. }
  302. return query.getResultList();
  303. }
  304. @Override
  305. public List queryForEntity(String sql, Class entityClass) {
  306. final javax.persistence.Query query1 = entityManager.createQuery(sql, entityClass);
  307. return query1.getResultList();
  308. }
  309. @Override
  310. public List queryForEntity(String sql, Object[] params, Class entityClass) {
  311. final javax.persistence.Query query1 = entityManager.createQuery(sql, entityClass);
  312. return this.queryForEntity(query1, params, entityClass);
  313. }
  314. @Override
  315. public List queryForEntity(String sql, Object[] params,
  316. Class entityClass, int firstResult, int maxResult) {
  317. final javax.persistence.Query query1 = entityManager.createQuery(sql, entityClass);
  318. SQLQuery query = query1.unwrap(SQLQuery.class);
  319. query.setMaxResults(maxResult).setFirstResult(firstResult);
  320. return this.queryForEntity(query1, params, entityClass);
  321. }
  322. /**
  323. * 查询返回一条数据,无数据则返回 null
  324. * @param sql
  325. * @param params
  326. * @param entityClass
  327. * @param <T>
  328. * @return
  329. */
  330. public <T> T queryForObject(String sql, Object[] params, Class<T> entityClass) {
  331. final javax.persistence.Query query1 = entityManager.createQuery(sql, entityClass);
  332. for (int i = 0; params != null && i < params.length; i++) {
  333. query1.setParameter(i, params[i]);
  334. }
  335. try {
  336. return (T) query1.getSingleResult();
  337. } catch (NoResultException e) {
  338. // 未查询到数据,则返回 null
  339. return null;
  340. } catch (NonUniqueResultException e) {
  341. // 查询到多条,则返回第 0 条
  342. return (T)query1.getResultList().get(0);
  343. }
  344. }
  345. @Override
  346. public Long queryForLong(String sql) {
  347. return this.queryForLong(sql, null);
  348. }
  349. @Override
  350. public Long queryForLong(String sql, Object[] params) {
  351. List list = this.querySQL(sql, params);
  352. if (list != null && list.size() > 0 && list.get(0) != null) {
  353. return new Long(((Number)list.get(0)).longValue());
  354. }
  355. return null;
  356. }
  357. @Override
  358. public int updateById(String id, Map<String, Object> params) {
  359. final String sql = getSQL(id);
  360. if(StringUtils.isBlank(sql)) {
  361. throw new IllegalArgumentException("undefined statement id: " + id);
  362. }
  363. final Object[] sqlParams = (params == null ? null : getParam(id, params));
  364. SQLQuery query = entityManager.createNativeQuery(sql).unwrap(SQLQuery.class);
  365. if (sqlParams != null && sqlParams.length > 0) {
  366. for (int i = 0; i < sqlParams.length; i++) {
  367. query.setParameter(i, sqlParams[i]);
  368. }
  369. }
  370. return query.executeUpdate();
  371. }
  372. @Override
  373. public int updateSQL(String sql, final Object[] params) {
  374. if (StringUtils.isBlank(sql)) {
  375. return 0;
  376. }
  377. SQLQuery query = entityManager.createNativeQuery(sql).unwrap(SQLQuery.class);
  378. if (params != null && params.length > 0) {
  379. for (int i = 0; i < params.length; i++) {
  380. query.setParameter(i, params[i]);
  381. }
  382. }
  383. return query.executeUpdate();
  384. }
  385. @Override
  386. public int[] batchUpdateSQL(String[] sql) {
  387. int[] r = new int[sql.length];
  388. for (int i = 0; i < sql.length; i++) {
  389. r[i] = updateSQL(sql[i], null);
  390. }
  391. return r;
  392. }
  393. @Override
  394. public List queryPageList(String sql, Object[] params, Page page) {
  395. SQLQuery query = entityManager.createNativeQuery(sql).unwrap(SQLQuery.class);
  396. for (int i = 0; params != null && i < params.length; i++) {
  397. query.setParameter(i, params[i]);
  398. }
  399. int totalCount = this.countSQL(sql, params);
  400. query.setMaxResults(page.getPageSize());
  401. query.setFirstResult(page.getStartIndex());
  402. List list = new ArrayList();
  403. if (totalCount > 0) {
  404. list = query.list();
  405. }
  406. page.setCurrRecords(list.size());
  407. page.setQueryResult(list);
  408. page.setTotalRecs(totalCount);
  409. return list;
  410. }
  411. @Override
  412. public List queryPageMap(String sql, Object[] params, Page page) {
  413. int totalCount = this.countSQL(sql, params);
  414. List<?> list = new ArrayList();
  415. if (totalCount > 0) {
  416. final javax.persistence.Query nativeQuery = entityManager.createNativeQuery(sql);
  417. SQLQuery query = nativeQuery.unwrap(SQLQuery.class);
  418. query.setMaxResults(page.getPageSize());
  419. query.setFirstResult(page.getStartIndex());
  420. return this.queryForMap(nativeQuery, params);
  421. }
  422. page.setCurrRecords(list.size());
  423. page.setQueryResult(list);
  424. page.setTotalRecs(totalCount);
  425. return list;
  426. }
  427. /*
  428. * (non-Javadoc)
  429. * @see com.primedata.primedatamm.core.dao.IDAOService
  430. * #queryPageEntity(java.lang.String, java.lang.Object[],
  431. * com.primedata.primedatamm.core.common.Page, EntityList)
  432. */
  433. @Override
  434. public List queryPageEntity(String sql, Object[] params, Page page, Class entityClass) {
  435. int totalCount = this.countSQL(sql, params);
  436. List<?> list = new ArrayList();
  437. if (totalCount > 0) {
  438. final javax.persistence.Query nativeQuery = entityManager.createNativeQuery(sql, entityClass);
  439. SQLQuery query = nativeQuery.unwrap(SQLQuery.class);
  440. for (int i = 0; params != null && i < params.length; i++) {
  441. query.setParameter(i, params[i]);
  442. }
  443. query.setMaxResults(page.getPageSize());
  444. query.setFirstResult(page.getStartIndex());
  445. return query.list();
  446. }
  447. page.setCurrRecords(list.size());
  448. page.setQueryResult(list);
  449. page.setTotalRecs(totalCount);
  450. return list;
  451. }
  452. /*
  453. * (non-Javadoc)
  454. * @see com.primedata.primedatamm.core.dao.IDAOService#getCountSQL(java.lang.String)
  455. */
  456. @Override
  457. public String getCountSQL(String sql) {
  458. return CoreSQLParser.getCountSQL(sql);
  459. }
  460. // count sql query result.
  461. @Override
  462. public int countSQL(String sql, Object[] params) {
  463. String strQuery = this.getCountSQL(sql);
  464. int count = 0;
  465. List<?> list = this.querySQL(strQuery, params);
  466. if (list != null && list.get(0) != null) {// 取出count总数
  467. count = ((Number)list.get(0)).intValue();
  468. }
  469. return count;
  470. }
  471. // 创建statement的id=getSEQ_xxx,其SQL如: select $sequence$.nextval from dual
  472. @Override
  473. public Long getSQNextValue(String sequence) {
  474. Map<String,Object> map = new HashMap<String,Object>();
  475. map.put("sequence", sequence);
  476. return queryForLong(getSQL("getSQNextValue", map), getParam("getSQNextValue", map));
  477. }
  478. @Override
  479. public Long getSQCurrValue(String sequence) {
  480. Map<String,Object> map = new HashMap<String,Object>();
  481. map.put("sequence", sequence);
  482. return queryForLong(getSQL("getSQCurrValue", map), getParam("getSQCurrValue", map));
  483. }
  484. }