SSH框架中的多条件搜索功能

记得第一次接触项目的任务就是实现多条件搜索的功能。由于本人菜鸟一枚,也是第一次写博客,想做做网络笔记,各位大牛有什么更好的方法,希望能提出来,借鉴借鉴,相互学习,共同进步。
我做的多条件搜索功能的思路就是拼接sql语句或者拼接hql语句,我相信各位大牛们也会懂。
举个例子:

学生表:id,学号,姓名,年龄
student: id,snumber,sname,age

老师表:id,姓名,工号,年龄
teacher: id,tname,tnumber,age

(教师与学生关联表):学生id,教师id
relationship: studentid,teacherid

选修课程表:id,老师id,学生id,课程名称
course:id,teacherid,studentid,name

对于学生表,老师表,课程表的id都是主键,而教师与学生关联表则是由学生id与教师id构成该表的主键。
学生与教师是多对多关系,学生有多个老师指导,老师可以教导多个学生,所以需要一个关联表,来记录他们的关系。
至于选修课程表就是,学生可以选修的不同课程来学习,教师也可以选择不同的选修课程来指导。(不要说为什么课程表不放到关联表里,因为这只是个例子,你可以理解成,“一个老师教不同课程,学生也上这个老师的不同课程”)

学生表对应的pojo类:StudentBean
教师表对应的pojo类:TeacherBean
关联表对应的pojo类:RelationShipBean
课程表对应的pojo类:CourseBean

至于hibernate的配置映射文件,就不详细贴出来了,把表与表之间具体关系如下图:
这里写图片描述

然后我们说说多条件搜索的问题了,多条件搜索就是拼接Hql语句,后台用json获取前台传递的数据。

问题1:搜索教师名字中含有“李”字和学生名字中含有“张”字的课程信息。
搜索条件:教师名字,学生名字(都是模糊搜索)
得出结果:符合条件的课程信息列表
思路:先通过给定的搜素条件,来获取学生的id,教师的id,然后分别存进set里面,然后判断set是否为空,不为空,就遍历set,执行的hql语句可能是:
1. FROM CourseBean WHERE 1=1;
2. FROM CourseBean WHERE 1=1 AND studentid = ‘”+sid+”’ AND techerid = ‘”+tid+”’;
3. FROM CourseBean WHERE 1=1 AND techerid = ‘”+tid+”’;
4. FROM CourseBean WHERE 1=1 AND studentid = ‘”+sid+”’;
最后就得出你想要的课程信息列表。。。

代码方法:

public String webQueryCourse(JSONObject json) throws Exception{
         try
          {
                String sname=null;//用于存放前台传过来的数据
                String tname=null;//用于存放前台传过来的数据    
                //用存放符合搜索条件的studentid的集合
                Set<String> studentSet=new HashSet<String>();
                Set<String> teacherSet=new HashSet<String>();
    //前台json有获取到sname数据就赋值给sname,没有的话,sname依然为null
                if(json.has("sname"))sname=json.getString("sname");
                if(json.has("tname"))service=json.getString("tname");
                //新建一个JSONObject,用于返回到前台
                JSONObject resultObj = new JSONObject();
                //用于存放课程的JSON数组
                JSONArray courseList = new JSONArray(); 
                //前台没有任何数据传过来,则默认搜索全部课程信息           
                String hql ="FROM CourseBean WHERE 1=1";                
    if(sname!=null&&sname.length()>0){
        String hql2="FROM StudentBean WHERE sname LIKE '%"+sname+"%'";
    List<StudentBean> studentlist = getDaoFacade().queryByHql(hql2);
        if(studentlist!=null){
            for(int i=0;i<studentlist.size();i++){
                        //获取一个学生的Bean实例
                        StudentBean student = servicelist.get(i);
                        studentSet.add(student.getId());
                    }
                }
            }
    if(tname!=null&&tname.length()>0){  
        String hql3="FROM TeacherBean WHERE tname LIKE '%"+tname+"%'";
    List<TeacherBean> teacherlist = getDaoFacade().queryByHql(hql3);
        if(teacherlist !=null){
            for(int j=0;j<teacherlist .size();j++){
                        //获取符合条件的一个教师Bean实例
                        TeacherBean teacher = servicelist.get(j);
                    //符合条件的教师id存进set中去
                        teacherSet.add(teacher.getId());
                    }
                }       
        }

        if(studentSet.size()>0){
            //遍历studentSet,每次循环把一个值赋给新的变量sid
            for(String sid : studentSet){
                if(teacherSet.size()>0){
                    for(String tid : teacherSet){
    hql += " AND studentid = '"+sid+"' AND techerid = '"+tid+"'";
                    }
                }else{
                    hql += " AND studentid = '"+sid+"'";
                }
            }
        }else if(teacherSet.size()>0){
            for(String tid : teacherSet){
                hql += " AND techerid = '"+tid+"'";
            }       
        }

    List<CourseBean> courselist = getDaoFacade().queryByHql(hql);
    if(courselist !=null){
        for(int k=0;k<courselist.size();k++){
            CourseBean course = courselist.get(k);
        //把搜索得到的课程Bean,存进jso,再存进courselist
            JSONObject jso = new JSONObject();
            jso.put("id",course.getId());
            jso.put("name",course.getName());
            jso.put("studentid",course.getStudentId());
            jso.put("teacherid",course.getTeacherId());
            courseList.put(jso);
        }
    }
        resultObj.put("courseList",courseList);
        return resultObj.toString();
     }catch(Exception e){
          e.printStackTrace();
           throw new RuntimeException(e.getMessage());
     }

    } 

问题2:搜索名字中带有“李”字和指导的学生中名字带有“张”字的教师信息。
搜索条件:教师姓名,学生姓名(模糊搜索)
得出结果:符合搜索条件的教师信息
思路:如下图:
这里写图片描述

方法1:

public String webQueryTeacher(JSONObject json) throws Exception{
    try{
        String tname=null;
        String sname=null;
        if(json.has("tname"))tname=json.getString("tname");
if(json.has("sname"))sname=json.getString("sname");
        JSONArray teacherList = new JSONArray();        
        JSONObject resultObjs= new JSONObject();

Set<String> studentSet = Collections.synchronizedSet(new LinkedHashSet<String>());

Set<JSONObject>teacheSet    =  Collections.synchronizedSet(new LinkedHashSet<JSONObject>());

//DetachedCriteria是一个hibernate的查询类,不用写hql实现查询功能,forClass函数相当于“FROM TeacherBean”
DetachedCriteria tquery = DetachedCriteria.forClass(TeacherBean.class);

//add()添加搜索条件,相当于“ WHERE tname LIKE '%"+tname+"%'”;第一个tname相当于TeacherBean中的属性
if(tname != null){
    tquerys.add(Restrictions.like("tname",tname, MatchMode.ANYWHERE));
}

//addOrder()按属性进行排序
tquerys.addOrder(Order.desc("id"));

//新建一个学生的查询
DetachedCriteria squery = DetachedCriteria.forClass(StudentBean.class);
if(sname!=null){
    squery.add(Restrictions.like("sname",sname, MatchMode.ANYWHERE));
}
//获取上述两个查询出来符合条件的两个BeanList
List<TeacherBean> teacherlist = getDaoFacade.getByCriteria(tquery);

List<StudentBean> studentlist = getDaoFacade.getByCriteria(squery);

if(teacherlist !=null){
    for(int i=0;i<teacherlist.size();i++){
        TeacherBean teacher = teacherlist.get(i);
        for(int j=0;j<studentlist.size();j++){
         StudentBean student = studentlist.get(i);
         Set<RelationShipBean>  Rset = student.getRelationShipBean();
        //遍历Rset 
         for(RelationShipBean Rset2 : Rset){
    //如果符合搜索条件的学生id,并且在这些学生id中的关联表里含有符合条件的教师id就存进teacherset里面去       if(Rset2.getTeacher().getId().equals(teacher .getId())){
                teacherSet.add(teacher.getId()); 
             }
         }
        } 
    }
}
        //遍历teacherset,把符合所有条件的教师信息存进JSONObject中去,再存进JSONArray的数组里,然后返回给前台
        Iterator<String> it = teacherSet.iterator();
        while(it.hasNext()){
            List<teacherBean> teacherlist = getDaoFacade().queryByHql("FROM teacherBean WHERE id = '"+it.next()+"'");
            JSONObject jso = new JSONObject();
            jso.put("id",teacherlist.get(0).getId());           jso.put("tname",teacherlist.get(0).getTName());         jso.put("age",teacherlist.get(0).getAge());         jso.put("tnumber",teacherlist.get(0).getTNumber());
            teacherList.put(jso);
        }
        resultObj.put("teacherlist",teacherList);
        return resultObj.toString();
    }catch(Exception e){
        e.printStackTrace();
        throw new RuntimeException(e.getMessage());
    }
}

方法2:拼接Hql语句
思路:先判断是否有学生姓名传入,没有则直接进行教师搜索,若也没有教师条件,则进行全部搜索。若有学生姓名条件传入,则先做学生姓名的条件模糊搜索,再判定有没有教师,没有教师条件传入,就根据学生姓名条件获取学生id,获取关联表的教师id,得出教师信息。若有教师条件传入,则先获取符合条件的学生id,根据学生id获取关联表的教师id1,把教师id1存进一个set里面,然后做教师条件的搜索,获取符合条件的教师list,取教师list中的每一个id与set中的id做对比,set中有这个list中的id,则存进另一个set(teacherset)中去,遍历teacherset然后存进Json,存入JSONArray,返回前台

public String webQueryTeacher2(JSONObject json) throws Exception{
    try{
        String tname=null;
        String sname=null;
        if(json.has("tname"))tname=json.getString("tname");
if(json.has("sname"))sname=json.getString("sname");
        JSONArray teacherList = new JSONArray();        
        JSONObject resultObjs= new JSONObject();
Set<String> teacherSet=new HashSet<String>();
if(sname!=null&&sname.length()>0){
    String hql2 ="FROM studentBean WHERE sname LIKE '%"+sname+"%'";
    List<studentBean> studentlist = getDaoFacade().queryByHql(hql2);    
    for(int i=0;i<studentlist.size();i++){
        studentBean student = studentlist.get(i);
        String hql3 ="FROM RelationShipBean WHERE studentid = '"+student.getId()+"'";
        List<RelationShipBean> relatelist = getDaoFacade().queryByHql(hql3);    
        for(int j=0;j<relatelist.size();j++){
            RelationShipBean relate = relatelist.get(j);            teacherSet.add(relate.getTeacherBean().getId());    
    }
}
if(tname!=null&&tname.length()>0){
    String hql = "FROM teacherBean WHERE tname LIKE '%"+tname+"%'";
    List<teacherBean> teacherlist = getDaoFacade().queryByHql(hql); 
    if(teacherlist!=null){
      for(int l=0;l<teacherlist.size();l++){
         teacherBean teacher2 = teacherlist.get(l);
         if(teacherSet.contains(teacher2.getId())){
                  JSONObject jso = new JSONObject();                jso.put("id",teacher2.getId());         jso.put("tname",teacher2.getTName());           jso.put("age",teacher2.getAge());           jso.put("tnumber",teacher2.getTNumber());
            teacherList.put(jso);
         }
            resultObj.put(teacherList);     
        }
    }
 }else{
     for (String teacherid : teacherSet) { 
         teacherBean teacher = getDaoFacade().get(teacherid);
          JSONObject jso = new JSONObject();            jso.put("id",teacher.getId());          jso.put("tname",teacher.getTName());            jso.put("age",teacher.getAge());            jso.put("tnumber",teacher.getTNumber());
        teacherList.put(jso);
    }
    resultObj.put(teacherList);
 }

}else if(tname!=null&&tname.length()>0){
    String hql ="FROM teacherBean WHERE tname LIKE '%"+tname+"%'";
    List<teacherBean> teacherlist = getDaoFacade().queryByHql(hql);
    for(int i=0;i<teacherlist.size();i++){
        JSONObject jso = new JSONObject();          jso.put("id",teacherlist.get(0).getId());           jso.put("tname",teacherlist.get(0).getTName());         jso.put("age",teacherlist.get(0).getAge());         jso.put("tnumber",teacherlist.get(0).getTNumber());
                teacherList.put(jso);
    }
            resultObj.put("teacherlist",teacherList);

}else{
    String hql ="FROM teacherBean WHERE 1=1";
    List<teacherBean> teacherlist = getDaoFacade().queryByHql(hql);
    for(int i=0;i<teacherlist.size();i++){
        JSONObject jso = new JSONObject();          jso.put("id",teacherlist.get(0).getId());           jso.put("tname",teacherlist.get(0).getTName());         jso.put("age",teacherlist.get(0).getAge());         jso.put("tnumber",teacherlist.get(0).getTNumber());
                teacherList.put(jso);
    }
            resultObj.put("teacherlist",teacherList);
}
return resultObj.toString();
    }catch(Exception e){
        e.printStackTrace();
        throw new RuntimeException(e.getMessage());
    }
}

终于写完,由于全部手打,不知道有代码有没有问题,第一次写博客,希望这文章对你有帮助,有错误请提出来,我会及时更正,谢谢大家

2018-08-07
账号找回来了,现在改用mybatis了,上面代码可能有点累赘

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值