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()); }}
终于写完,由于全部手打,不知道有代码有没有问题,第一次写博客,希望这文章对你有帮助,有错误请提出来,我会及时更正,谢谢大家
- SSH框架中的多条件搜索功能
- grails多条件搜索功能实现1
- SSH框架功能介绍
- 多条件搜索功能的sql语句拼写技巧
- C#用集合做 多条件搜索功能
- DEDE首页自定义字段、多条件搜索功能
- Laravel 框架 ajax多条件搜索后 分页
- SSH实现带条件查询分页功能
- SSH框架中的Spring
- ssh框架中的basedao
- 比百度还好用的搜索功能,支持「多条件」搜索哟
- Word中的搜索功能
- SSH框架分层功能区分
- 多条件搜索 sql
- grep 多条件搜索
- 多条件搜索
- sphinx多条件搜索
- yii2 多条件搜索
- c++下可调对象作为参数的实现
- 安卓APP设计规范和设计细节
- 第一天:NodeJs Windows环境搭建、学习资料地址、注意事项总结
- 学习设计模式笔记之工厂模式1
- 运维的工具有监控zabbix
- SSH框架中的多条件搜索功能
- 【安卓基础六】安卓打包过程与安装,安卓资源
- Android 6.0 运行时权限处理完全解析
- app版本更新提醒
- 联合树
- Spark pipe + PHP 的 wordcount 实现
- Codeforces Round #345 (Div. 1) C. Table Compression
- Ubuntu安装OBS(Open Broadcaster Software)
- python入门(三)