CustomBaseSqlDaoImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  1. package com.jeff.tianti.common.dao;
  2. import java.math.BigInteger;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.regex.Matcher;
  7. import java.util.regex.Pattern;
  8. import javax.persistence.EntityManager;
  9. import javax.persistence.Query;
  10. import org.hibernate.SQLQuery;
  11. import org.hibernate.criterion.CriteriaSpecification;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import com.jeff.tianti.common.entity.PageModel;
  14. public class CustomBaseSqlDaoImpl {
  15. @Autowired
  16. private EntityManager em;
  17. public List<Map<String, Object>> querySqlObjects(String sql, Integer currentPage,Integer rowsInPage){
  18. return this.querySqlObjects(sql, null, currentPage, rowsInPage);
  19. }
  20. public List<Map<String, Object>> querySqlObjects(String sql){
  21. return this.querySqlObjects(sql, null, null, null);
  22. }
  23. public List<Map<String, Object>> querySqlObjects(String sql, List<Object> params){
  24. return this.querySqlObjects(sql, params, null, null);
  25. }
  26. @SuppressWarnings("unchecked")
  27. public List<Map<String, Object>> querySqlObjects(String sql, Object params, Integer currentPage,Integer rowsInPage){
  28. Query qry = em.createNativeQuery(sql);
  29. SQLQuery s = qry.unwrap(SQLQuery.class);
  30. //设置参数
  31. if(params != null){
  32. if(params instanceof List){
  33. List<Object> paramList = (List<Object>) params;
  34. for(int i = 0, size = paramList.size(); i < size; i++){
  35. qry.setParameter(i+1, paramList.get(i));
  36. }
  37. }else if(params instanceof Map){
  38. Map<String, Object> paramMap = (Map<String, Object>) params;
  39. for(String key : paramMap.keySet()){
  40. qry.setParameter(key, paramMap.get(key));
  41. }
  42. }
  43. }
  44. if (currentPage != null && rowsInPage != null) {//判断是否有分页
  45. // 起始对象位置
  46. qry.setFirstResult(rowsInPage * (currentPage - 1));
  47. // 查询对象个数
  48. qry.setMaxResults(rowsInPage);
  49. }
  50. s.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
  51. List<Map<String, Object>> resultList=new ArrayList<Map<String, Object>>();
  52. try {
  53. resultList=s.list();
  54. } catch (Exception e) {
  55. }finally{
  56. em.close();
  57. }
  58. return resultList;
  59. }
  60. public PageModel<Map<String, Object>> querySqlObjects(String sql,
  61. String sbCount, Map<String, Object> params, Integer currentPage,Integer rowsInPage){
  62. PageModel<Map<String, Object>> pageModel = new PageModel<Map<String, Object>>();
  63. List<Map<String, Object>> list = this.querySqlObjects(sql, params, currentPage, rowsInPage);
  64. pageModel.setList(list);
  65. if(currentPage == null || rowsInPage == null){
  66. pageModel.setTotalCount(list == null ? 0 : list.size());
  67. }else{
  68. Integer count = this.queryCountBySql(sbCount, params);
  69. pageModel.setCurrentPage(currentPage);
  70. pageModel.setTotalCount(count);
  71. pageModel.setPageSize(rowsInPage);
  72. int totalPage = 0;
  73. if(count%rowsInPage == 0){
  74. totalPage = count / rowsInPage;
  75. }else{
  76. totalPage = count / rowsInPage + 1;
  77. }
  78. pageModel.setTotalPage(totalPage);
  79. }
  80. return pageModel;
  81. }
  82. public int getCount(String sql){
  83. String sqlCount="select count(0) count_num from ("+sql+") as total";
  84. List<Map<String, Object>> list = this.querySqlObjects(sqlCount);
  85. if(list.size() > 0){
  86. int countNum=((BigInteger) list.get(0).get("count_num")).intValue();
  87. return countNum;
  88. }else{
  89. return 0;
  90. }
  91. }
  92. /**
  93. * 处理sql语句
  94. *
  95. * @param _strSql
  96. * @return
  97. */
  98. public String toSql(String _strSql) {
  99. String strNewSql = _strSql;
  100. if (strNewSql != null) {
  101. strNewSql = regReplace("'", "''", strNewSql);
  102. } else {
  103. strNewSql = "";
  104. }
  105. return strNewSql;
  106. }
  107. private String regReplace(String strFind, String strReplacement, String strOld) {
  108. String strNew = strOld;
  109. Pattern p = null;
  110. Matcher m = null;
  111. try {
  112. p = Pattern.compile(strFind);
  113. m = p.matcher(strOld);
  114. strNew = m.replaceAll(strReplacement);
  115. } catch (Exception e) {
  116. }
  117. return strNew;
  118. }
  119. /**
  120. * 根据hql语句查询数据
  121. * @param hql
  122. * @return
  123. */
  124. @SuppressWarnings("rawtypes")
  125. public List queryForList(String hql, List<Object> params){
  126. Query query = em.createQuery(hql);
  127. List list = null;
  128. try {
  129. if(params != null && !params.isEmpty()){
  130. for(int i=0,size=params.size();i<size;i++){
  131. query.setParameter(i+1, params.get(i));
  132. }
  133. }
  134. list = query.getResultList();
  135. } catch (Exception e) {
  136. e.printStackTrace();
  137. }finally{
  138. em.close();
  139. }
  140. return list;
  141. }
  142. @SuppressWarnings("rawtypes")
  143. public List queryByMapParams(String hql, Map<String, Object> params, Integer currentPage,Integer pageSize){
  144. //EntityManager em = this.emf.createEntityManager();
  145. Query query = em.createQuery(hql);
  146. List list = null;
  147. try {
  148. if(params != null && !params.isEmpty()){
  149. for(Map.Entry<String,Object> entry: params.entrySet()){
  150. query.setParameter(entry.getKey(), entry.getValue());
  151. }
  152. }
  153. if(currentPage != null && pageSize != null){
  154. query.setFirstResult((currentPage-1)*pageSize);
  155. query.setMaxResults(pageSize);
  156. }
  157. list = query.getResultList();
  158. } catch (Exception e) {
  159. e.printStackTrace();
  160. }finally{
  161. em.close();
  162. }
  163. return list;
  164. }
  165. @SuppressWarnings("rawtypes")
  166. public List queryByMapParams(String hql, Map<String, Object> params){
  167. return queryByMapParams(hql, params, null, null);
  168. }
  169. @SuppressWarnings("rawtypes")
  170. public List queryForList(String hql){
  171. return queryForList(hql, null);
  172. }
  173. /**
  174. * 根据hql语句和分页条件查找分页数据
  175. * @param hql
  176. * @param currentPage
  177. * @param pageSize
  178. * @return
  179. */
  180. @SuppressWarnings({ "rawtypes", "unchecked" })
  181. public PageModel queryForPage(String hql,int currentPage,int pageSize){
  182. PageModel page = new PageModel();
  183. List list = null;
  184. Integer totalCount = 0;
  185. Integer totalPage = 0; //总页数
  186. try {
  187. int firstResult = (currentPage-1)*pageSize;
  188. Query query = em.createQuery(hql);
  189. query.setMaxResults(pageSize);
  190. query.setFirstResult(firstResult);
  191. list = query.getResultList();
  192. Query query2 = em.createQuery(hql);
  193. List list2 = query2.getResultList();
  194. totalCount = (list2 == null) ? 0 : list2.size();
  195. if(totalCount % pageSize == 0){
  196. totalPage = totalCount/pageSize;
  197. }else{
  198. totalPage = totalCount/pageSize + 1;
  199. }
  200. page.setCurrentPage(currentPage);
  201. page.setList(list);
  202. page.setPageSize(pageSize);
  203. page.setTotalCount(totalCount);
  204. page.setTotalPage(totalPage);
  205. } catch (Exception e) {
  206. e.printStackTrace();
  207. }finally{
  208. em.close();
  209. }
  210. return page;
  211. }
  212. /**
  213. *
  214. * @param hql
  215. * @param hqlCount 查询所有数据的hql
  216. * @param params
  217. * @param currentPage
  218. * @param pageSize
  219. * @return
  220. */
  221. @SuppressWarnings({ "unchecked", "rawtypes" })
  222. public PageModel queryForPageWithParams(String hql, String hqlCount, Map<String,Object> params, int currentPage,int pageSize){
  223. PageModel page = new PageModel();
  224. List<Object> list = null;
  225. Integer totalCount = 0;
  226. Integer totalPage = 0;
  227. //EntityManager em = this.emf.createEntityManager();
  228. Query query = em.createQuery(hql);
  229. try {
  230. if(params != null){
  231. for(Map.Entry<String,Object> entry: params.entrySet()){
  232. query.setParameter(entry.getKey(), entry.getValue());
  233. }
  234. }
  235. query.setMaxResults(pageSize);
  236. query.setFirstResult((currentPage-1)*pageSize);
  237. list = query.getResultList();
  238. totalCount = this.queryCount(hqlCount, params).intValue();
  239. if(totalCount % pageSize == 0){
  240. totalPage = totalCount/pageSize;
  241. }else{
  242. totalPage = totalCount/pageSize + 1;
  243. }
  244. page.setCurrentPage(currentPage);
  245. page.setPageSize(pageSize);
  246. page.setList(list);
  247. page.setTotalCount(totalCount);
  248. page.setTotalPage(totalPage);
  249. } catch (Exception e) {
  250. e.printStackTrace();
  251. }finally{
  252. em.close();
  253. }
  254. return page;
  255. }
  256. @SuppressWarnings({ "unchecked", "rawtypes" })
  257. public PageModel queryForPageWithParams(String hql,Map<String,Object> params, int currentPage,int pageSize){
  258. PageModel page = new PageModel();
  259. List<Object> list = null;
  260. Integer totalCount = 0;
  261. Integer totalPage = 0;
  262. //EntityManager em = this.emf.createEntityManager();
  263. Query query = em.createQuery(hql);
  264. try {
  265. if(params != null){
  266. for(Map.Entry<String,Object> entry: params.entrySet()){
  267. query.setParameter(entry.getKey(), entry.getValue());
  268. }
  269. }
  270. query.setMaxResults(pageSize);
  271. query.setFirstResult((currentPage-1)*pageSize);
  272. list = query.getResultList();
  273. Query queryTotal = em.createQuery(hql);
  274. if(params != null){
  275. for(Map.Entry<String,Object> entry: params.entrySet()){
  276. queryTotal.setParameter(entry.getKey(), entry.getValue());
  277. }
  278. }
  279. List<Object> totlaList = queryTotal.getResultList();
  280. totalCount = (totlaList == null) ? 0 : totlaList.size();
  281. if(totalCount % pageSize == 0){
  282. totalPage = totalCount/pageSize;
  283. }else{
  284. totalPage = totalCount/pageSize + 1;
  285. }
  286. page.setCurrentPage(currentPage);
  287. page.setPageSize(pageSize);
  288. page.setList(list);
  289. page.setTotalCount(totalCount);
  290. page.setTotalPage(totalPage);
  291. } catch (Exception e) {
  292. e.printStackTrace();
  293. }finally{
  294. em.close();
  295. }
  296. return page;
  297. }
  298. /**
  299. * 根据SQL语句查询分页
  300. * @param sql
  301. * @param currentPage
  302. * @param pageSize
  303. * @return
  304. */
  305. @SuppressWarnings({ "rawtypes", "unchecked" })
  306. public PageModel queryForPageBySql(String sql,Integer currentPage,Integer pageSize){
  307. PageModel page = new PageModel();
  308. Integer totalCount = 0;
  309. Integer totalPage = 0;
  310. //EntityManager em = this.emf.createEntityManager();
  311. Query qry = em.createNativeQuery(sql);
  312. Query qry2 = em.createNativeQuery(sql);
  313. SQLQuery s = qry.unwrap(SQLQuery.class);
  314. if (currentPage != null && pageSize != null) {//判断是否有分页
  315. // 起始对象位置
  316. qry.setFirstResult(pageSize * (currentPage - 1));
  317. // 查询对象个数
  318. qry.setMaxResults(pageSize);
  319. }
  320. s.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
  321. List<Map> resultList=new ArrayList<Map>();
  322. List list = qry2.getResultList();
  323. totalCount = (list == null ? 0 : list.size());
  324. if(totalCount % pageSize == 0){
  325. totalPage = totalCount/pageSize;
  326. }else{
  327. totalPage = totalCount/pageSize + 1;
  328. }
  329. try {
  330. resultList=s.list();
  331. page.setCurrentPage(currentPage);
  332. page.setPageSize(pageSize);
  333. page.setList(resultList);
  334. page.setTotalCount(totalCount);
  335. page.setTotalPage(totalPage);
  336. } catch (Exception e) {
  337. e.printStackTrace();
  338. }finally{
  339. em.close();
  340. }
  341. return page;
  342. }
  343. @SuppressWarnings({ "rawtypes", "unchecked" })
  344. public PageModel queryForPageBySql(String sql,Map<String,Object> params,Integer currentPage,Integer pageSize){
  345. PageModel page = new PageModel();
  346. Integer totalCount = 0;
  347. Integer totalPage = 0;
  348. Query qry = em.createNativeQuery(sql);
  349. Query qry2 = em.createNativeQuery(sql);
  350. for(Map.Entry<String,Object> entry: params.entrySet()){
  351. qry.setParameter(entry.getKey(), entry.getValue());
  352. qry2.setParameter(entry.getKey(), entry.getValue());
  353. }
  354. SQLQuery s = qry.unwrap(SQLQuery.class);
  355. if (currentPage != null && pageSize != null) {//判断是否有分页
  356. // 起始对象位置
  357. qry.setFirstResult(pageSize * (currentPage - 1));
  358. // 查询对象个数
  359. qry.setMaxResults(pageSize);
  360. }
  361. s.setResultTransformer(CriteriaSpecification.ALIAS_TO_ENTITY_MAP);
  362. List<Map> resultList=new ArrayList<Map>();
  363. List list = qry2.getResultList();
  364. totalCount = (list == null ? 0 : list.size());
  365. if(totalCount % pageSize == 0){
  366. totalPage = totalCount/pageSize;
  367. }else{
  368. totalPage = totalCount/pageSize + 1;
  369. }
  370. try {
  371. resultList=s.list();
  372. page.setCurrentPage(currentPage);
  373. page.setPageSize(pageSize);
  374. page.setList(resultList);
  375. page.setTotalCount(totalCount);
  376. page.setTotalPage(totalPage);
  377. } catch (Exception e) {
  378. e.printStackTrace();
  379. }finally{
  380. em.close();
  381. }
  382. return page;
  383. }
  384. /**
  385. * 查询总数
  386. * @param hql
  387. * @param params
  388. * @return
  389. */
  390. public Long queryCount(String hql, Map<String, Object> params){
  391. //EntityManager em = this.emf.createEntityManager();
  392. Query query = em.createQuery(hql);
  393. Long count = null;
  394. try{
  395. if(params != null && !params.isEmpty()){
  396. for(Map.Entry<String,Object> entry: params.entrySet()){
  397. query.setParameter(entry.getKey(), entry.getValue());
  398. }
  399. }
  400. count = (Long) query.getSingleResult();
  401. }catch (Exception e) {
  402. e.printStackTrace();
  403. }finally{
  404. em.close();
  405. }
  406. return count;
  407. }
  408. /**
  409. * 查询总数
  410. * @param hql
  411. * @param params
  412. * @return
  413. */
  414. public Integer queryCountBySql(String sql, Map<String, Object> params){
  415. Integer count = null;
  416. try {
  417. Query query = em.createNativeQuery(sql);
  418. if(params != null && !params.isEmpty()){
  419. for(Map.Entry<String,Object> entry: params.entrySet()){
  420. query.setParameter(entry.getKey(), entry.getValue());
  421. }
  422. }
  423. Object obj = query.getSingleResult();
  424. if(obj instanceof BigInteger){
  425. count = ((BigInteger) obj).intValue();
  426. }else{
  427. count = (Integer) obj;
  428. }
  429. } finally {
  430. if(em != null){
  431. em.close();
  432. }
  433. }
  434. return count;
  435. }
  436. /**
  437. * select count(*) from table
  438. * @param sql
  439. * @param params
  440. * @return
  441. */
  442. public int executeSql(String sql, List<Object> params){
  443. try {
  444. Query query = em.createNativeQuery(sql);
  445. if(params != null && !params.isEmpty()){
  446. for(int i = 0, size = params.size(); i < size; i++){
  447. query.setParameter(i+1, params.get(i));
  448. }
  449. }
  450. return query.executeUpdate();
  451. } finally {
  452. if(em != null){
  453. em.close();
  454. }
  455. }
  456. }
  457. }