/flash-waimai-core/src/main/java/cn/enilu/flash/dao/MongoRepository.java

https://github.com/microapp-store/flash-waimai · Java · 273 lines · 217 code · 34 blank · 22 comment · 43 complexity · c46a2f997509263987d7e83eaea3f016 MD5 · raw file

  1. package cn.enilu.flash.dao;
  2. import cn.enilu.flash.bean.entity.front.BaseMongoEntity;
  3. import cn.enilu.flash.utils.factory.Page;
  4. import com.mongodb.client.result.UpdateResult;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.data.domain.PageRequest;
  7. import org.springframework.data.domain.Pageable;
  8. import org.springframework.data.domain.Sort;
  9. import org.springframework.data.geo.Distance;
  10. import org.springframework.data.geo.GeoResults;
  11. import org.springframework.data.geo.Metrics;
  12. import org.springframework.data.geo.Point;
  13. import org.springframework.data.mongodb.core.MongoTemplate;
  14. import org.springframework.data.mongodb.core.query.Criteria;
  15. import org.springframework.data.mongodb.core.query.NearQuery;
  16. import org.springframework.data.mongodb.core.query.Query;
  17. import org.springframework.data.mongodb.core.query.Update;
  18. import org.springframework.stereotype.Repository;
  19. import java.util.Collections;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.Objects;
  23. /**
  24. * Created on 2017/12/29 0029.
  25. *
  26. * @Author enilu
  27. */
  28. @Repository
  29. public class MongoRepository {
  30. @Autowired
  31. private MongoTemplate mongoTemplate;
  32. public void save(BaseMongoEntity entity) {
  33. mongoTemplate.save(entity);
  34. }
  35. public void save(Object data, String collectionName) {
  36. mongoTemplate.save(data, collectionName);
  37. }
  38. public void delete(Long id, String collectionName) {
  39. mongoTemplate.remove(Query.query(Criteria.where("id").is(id)), collectionName);
  40. }
  41. public void delete(String collectionName, Map<String, Object> keyValues) {
  42. mongoTemplate.remove(Query.query(criteria(keyValues)), collectionName);
  43. }
  44. public void clear(Class klass){
  45. mongoTemplate.dropCollection(klass);
  46. mongoTemplate.createCollection(klass);
  47. }
  48. public void clear(String collectionName){
  49. mongoTemplate.dropCollection(collectionName);
  50. mongoTemplate.createCollection(collectionName);
  51. }
  52. public void update(BaseMongoEntity entity) {
  53. mongoTemplate.save(entity);
  54. }
  55. public UpdateResult update(Long id, String collectionName, Map<String, Object> keyValues) {
  56. Update update = null;
  57. for (Map.Entry<String, Object> entry : keyValues.entrySet()) {
  58. if (update == null) {
  59. update = Update.update(entry.getKey(), entry.getValue());
  60. } else {
  61. update.set(entry.getKey(), entry.getValue());
  62. }
  63. }
  64. return mongoTemplate.updateFirst(Query.query(Criteria.where("id").is(id)), update, collectionName);
  65. }
  66. public UpdateResult update(String id, String collectionName, Map<String, Object> keyValues) {
  67. Update update = null;
  68. for (Map.Entry<String, Object> entry : keyValues.entrySet()) {
  69. if (update == null) {
  70. update = Update.update(entry.getKey(), entry.getValue());
  71. } else {
  72. update.set(entry.getKey(), entry.getValue());
  73. }
  74. }
  75. return mongoTemplate.updateFirst(Query.query(Criteria.where("_id").is(id)), update, collectionName);
  76. }
  77. public <T, P> T findOne(Class<T> klass, P key) {
  78. return findOne(klass, "id", key);
  79. }
  80. public <T> T findOne(Class<T> klass, Map<String,Object> params) {
  81. Criteria criteria = criteria(params);
  82. if (criteria != null) {
  83. return mongoTemplate.findOne(Query.query(criteria), klass);
  84. }
  85. return null;
  86. }
  87. public <T> T findOne(Class<T> klass, String key, Object value) {
  88. return mongoTemplate.findOne(Query.query(Criteria.where(key).is(value)), klass);
  89. }
  90. public Object findOne(Long id, String collectionName) {
  91. return mongoTemplate.findOne(Query.query(Criteria.where("id").is(id)), Map.class, collectionName);
  92. }
  93. public Map findOne(String collectionName, Object... extraKeyValues) {
  94. Criteria criteria = criteria(extraKeyValues);
  95. if (Objects.isNull(criteria)) {
  96. List<Map> list = mongoTemplate.findAll(Map.class, collectionName);
  97. if (list != null && !list.isEmpty()) {
  98. return list.get(0);
  99. }
  100. return Collections.emptyMap();
  101. }
  102. return mongoTemplate.findOne(Query.query(criteria), Map.class, collectionName);
  103. }
  104. public <T> T findOne(Class<T> klass) {
  105. Query query = new Query();
  106. return mongoTemplate.findOne(query, klass);
  107. }
  108. public <T> T findOne(Class<T> klass, Object... keyValues) {
  109. Criteria criteria = criteria(keyValues);
  110. if (criteria == null) {
  111. List<T> list = mongoTemplate.findAll(klass);
  112. if (list != null) {
  113. return list.get(0);
  114. }
  115. return null;
  116. }
  117. return mongoTemplate.findOne(Query.query(criteria), klass);
  118. }
  119. public <T> Page<T> queryPage(Page<T> page, Class<T> klass) {
  120. return queryPage(page, klass, null);
  121. }
  122. public <T> Page<T> queryPage(Page<T> page, Class<T> klass, Map<String, Object> params) {
  123. Pageable pageable = PageRequest.of(page.getCurrent() - 1, page.getSize(), Sort.Direction.DESC, "id");
  124. Query query = new Query();
  125. if (params != null && !params.isEmpty()) {
  126. Criteria criteria = criteria(params);
  127. query = Query.query(criteria);
  128. }
  129. List<T> list = mongoTemplate.find(query.with(pageable), klass);
  130. Long count = count(klass, params);
  131. page.setTotal(count.intValue());
  132. page.setRecords(list);
  133. return page;
  134. }
  135. public <T> List<T> findAll(Class<T> klass) {
  136. return mongoTemplate.findAll(klass);
  137. }
  138. public <T> List<T> findAll(Class<T> klass, Object... keyValues) {
  139. Criteria criteria = criteria(keyValues);
  140. return mongoTemplate.find(Query.query(criteria), klass);
  141. }
  142. public <T> List<T> findAll(Class<T> klass, Map<String, Object> keyValues) {
  143. Criteria criteria = criteria(keyValues);
  144. return mongoTemplate.find(Query.query(criteria), klass);
  145. }
  146. public List findAll(String collection) {
  147. return mongoTemplate.findAll(Map.class, collection);
  148. }
  149. public List<Map> findAll(String collectionName, Object... keyValues) {
  150. Criteria criteria = criteria(keyValues);
  151. return mongoTemplate.find(Query.query(criteria), Map.class, collectionName);
  152. }
  153. /**
  154. * 查询指定位置附近的商家
  155. * @param x
  156. * @param y
  157. * @param collectionName
  158. * @param params
  159. * @param miles 公里数
  160. * @return
  161. */
  162. public GeoResults<Map> near(double x, double y, String collectionName, Map<String, Object> params,Integer miles) {
  163. Point location = new Point(x, y);
  164. NearQuery nearQuery = NearQuery.near(location).maxDistance(new Distance(miles, Metrics.MILES));
  165. if (params != null && !params.isEmpty()) {
  166. Query query = Query.query(criteria(params));
  167. nearQuery.query(query);
  168. }
  169. try {
  170. return mongoTemplate.geoNear(nearQuery, Map.class, collectionName);
  171. }catch (Exception e){
  172. System.out.println(e.getMessage());
  173. }
  174. return null;
  175. }
  176. /**
  177. * 查询指定位置附近的商家,默认查询十公里范围内
  178. * @param x
  179. * @param y
  180. * @param collectionName
  181. * @param params
  182. * @return
  183. */
  184. public GeoResults<Map> near(double x, double y, String collectionName, Map<String, Object> params) {
  185. return near(x,y,collectionName,params,50);
  186. }
  187. public long count(Class klass) {
  188. return count(klass, null);
  189. }
  190. public long count(Class klass, Map<String, Object> params) {
  191. Criteria criteria = criteria(params);
  192. if (criteria == null) {
  193. return mongoTemplate.count(new Query(), klass);
  194. } else {
  195. return mongoTemplate.count(Query.query(criteria), klass);
  196. }
  197. }
  198. public long count(String collection) {
  199. return mongoTemplate.count(null, collection);
  200. }
  201. public long count(String collection, Map<String, Object> params) {
  202. Criteria criteria = criteria(params);
  203. if (criteria == null) {
  204. return mongoTemplate.count(null, collection);
  205. } else {
  206. return mongoTemplate.count(Query.query(criteria), collection);
  207. }
  208. }
  209. private Criteria criteria(Map<String, Object> map) {
  210. Criteria criteria = null;
  211. if (map != null) {
  212. for (Map.Entry<String, Object> entry : map.entrySet()) {
  213. if (criteria == null) {
  214. criteria = Criteria.where(entry.getKey()).is(entry.getValue());
  215. } else {
  216. criteria.and(entry.getKey()).is(entry.getValue());
  217. }
  218. }
  219. }
  220. return criteria;
  221. }
  222. private Criteria criteria(Object... extraKeyValues) {
  223. Criteria criteria = null;
  224. if (extraKeyValues.length % 2 != 0) {
  225. throw new IllegalArgumentException();
  226. } else {
  227. for (int i = 0; i < extraKeyValues.length; i += 2) {
  228. Object k = extraKeyValues[i];
  229. Object v = extraKeyValues[i + 1];
  230. if (i == 0) {
  231. criteria = Criteria.where(k.toString()).is(v);
  232. } else {
  233. criteria.and(k.toString()).is(v);
  234. }
  235. }
  236. }
  237. return criteria;
  238. }
  239. }