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     }

猜你喜欢

转载自www.cnblogs.com/Rousseau/p/10154468.html