记得第一次接触项目的任务就是实现多条件搜索的功能。由于本人菜鸟一枚,也是第一次写博客,想做做网络笔记,各位大牛有什么更好的方法,希望能提出来,借鉴借鉴,相互学习,共同进步。
我做的多条件搜索功能的思路就是拼接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了,上面代码可能有点累赘