1. 程式人生 > >java不確定多條件篩選

java不確定多條件篩選

最近在做一個專案涉及到了一個多表、多條件、不確定篩選的功能,在這裡和大家分享一下。

首先,我所使用的是SSH框架,多年的專案經驗和麵向物件思維的引導,我對Hibernate情有獨鍾;

其次,業務需求是要實現周邊店鋪的查詢,查詢的條件包括城市、縣區、街道、周邊距離、是否有優惠券、人均消費、網紅、老字號、新店等10個條件;

再次,資料庫中有三張表,shop-存放店鋪資訊,present存放優惠券資訊,周邊的距離計算使用的是聚合計算加別名的方式來實現。由於程式碼數量很大和一些資訊涉及公司機密,部分程式碼不宜展示,所以沒有在github風向全部的程式碼

 1 public List<Shop> getShopByCondition(String lat,String lng,String min,String max,Shop shop,Presence presence,int
startIndex,int pageSize) { 2 // TODO Auto-generated method stub 3 //String lat="30.66074"; 4 //String lng="104.06327"; 5 String distance=" ACOS(SIN((s.lat * 3.1415926) / 180 ) *SIN(("+lat+" * 3.1415926) / 180 ) +COS((s.lat * 3.1415926) / 180 ) * COS(("+lat+" * 3.1415926) / 180 ) " 6
+"*COS((s.lng* 3.1415926) / 180 - ("+lng+" * 3.1415926) / 180 ) ) * 6380 * 1000 "; 7 Map<String, Object> map =new HashMap<>(); 8 9 String hql =""; 10 hql = "SELECT s.sid,s.shopname,s.shoplogo_pic,s.province,s.city,s.county,s.town,s.village,s.adress,p.price,s.event,s.eventinfo,s.tag,s.old,s.status,s.lat,s.lng,s.hot,s.vip,s.grade,s.avger, " 11
+distance+" as distance " 12 +"FROM t_shop s,t_presence p,t_users u " 13 +"WHERE 1=1 "; 14 if(this.isNotBlank(shop.getProvince())){ 15 map.put("s.province=","'"+shop.getProvince()+"'"); 16 } 17 if(this.isNotBlank(shop.getCity())){ 18 map.put("s.city=","'"+shop.getCity()+"'"); 19 } 20 if(this.isNotBlank(shop.getCounty())){ 21 map.put("s.county=","'"+shop.getCounty()+"'"); 22 } 23 if(this.isNotBlank(shop.getTown())){ 24 map.put("s.town=","'"+shop.getTown()+"'"); 25 } 26 if(this.isNotBlank(shop.getDistance())){ 27 map.put(distance+"<=",shop.getDistance()); 28 } 29 if(this.isNotBlank(shop.getTag())){ 30 map.put("s.tag=",shop.getTag()); 31 } 32 if (this.isNotBlank(min)) { 33 if(this.isNotBlank(min)&&this.isNotBlank(max)){ 34 map.put("s.avger between " +min+" and ",Integer.parseInt(max)); 35 }else { 36 map.put("s.avger >",Integer.parseInt(min)); 37 } 38 39 } 40 if(this.isNotBlank(shop.getOld())){ 41 map.put("s.old=",shop.getOld()); 42 } 43 if(this.isNotBlank(presence.getMedia())&&Integer.parseInt(presence.getMedia())<=5){ 44 map.put("s.sid=p.sid and p.media<=",presence.getMedia()); 45 } 46 if(this.isNotBlank(presence.getMedia())&&Integer.parseInt(presence.getMedia())>5){ 47 map.put("s.sid=p.sid and p.media>",presence.getMedia()); 48 } 49 if(this.isNotBlank(presence.getVip())){ 50 map.put("s.sid=p.sid and p.vip>= ",presence.getVip()); 51 } 52 for (String key : map.keySet()) { 53 hql=hql+" and "+key+" "+map.get(key); 54 } 55 hql += " GROUP BY s.sid " 56 +" ORDER BY "+distance+" ,p.price DESC "; 57 Query query = sessionFactory.getCurrentSession().createSQLQuery(hql); 58 query.setCacheable(false); 59 int pageNo=pageSize*(startIndex); 60 query.setFirstResult(pageNo); 61 query.setMaxResults(pageSize); 62 List<Shop> list=query.setResultTransformer(AliasToEntityMapResultTransformer.INSTANCE).list(); 63 return list; 64 }