最近在做一个项目涉及到了一个多表、多条件、不确定筛选的功能,在这里和大家分享一下。
首先,我所使用的是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 }