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

来源:互联网 发布:linux tar 解压 编辑:程序博客网 时间:2024/06/07 06:01
记得第一次接触项目的任务就是实现多条件搜索的功能。由于本人菜鸟一枚,也是第一次写博客,想做做网络笔记,各位大牛有什么更好的方法,希望能提出来,借鉴借鉴,相互学习,共同进步。我做的多条件搜索功能的思路就是拼接sql语句或者拼接hql语句,我相信各位大牛们也会懂。举个例子:学生表:id,学号,姓名,年龄student: id,snumber,sname,age老师表:id,姓名,工号,年龄teacher: id,tname,tnumber,age(教师与学生关联表):学生id,教师idrelationship: 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));}//获取上述两个查询出来符合条件的两个BeanListList<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());    }}

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

0 0
原创粉丝点击