日期:2014-05-19  浏览次数:20638 次

sql ,hql 如何实现多个条件查询自由动态拼接
假如我有5个输入框,代表5个查询条件,怎样才能实现根据用户自由输入一个或多个条件的不同而得到不同的查询结果呢??

------解决方案--------------------
1楼的代码,拼接会有严重的安全隐患!

建议使用占位符吧,然后定义一个list来保存条件参数(有位置顺序)。

在hibernate的回调函数中再读取参数。
------解决方案--------------------
String sql = "select * from table where 1=1";
if(name != ""){
sql+=" and name="+name;
}
if(pass != ""){
sql += " and pass="+pass;
}
....

执行查询语句。。
------解决方案--------------------
首先你的DAO查找的操作要这样写:
public List findObjectByWhere(String sql_param,List param){
StringBuffer sql = new StringBuffer("select * from tablet_name where 1=1 ");
........
.........

}

if(sql_param!=null && !sql_param.equals("")){
sql.append(sql_param);
}
 if(param!=null && param.size()!=0){
//下面就是设置?号参数啦
....
 }

拼接的地方就这样行啦
先定义一个StringBuffer和一个List

StringBuffer buff = new StringBuffer();
List list = new ArrayList();
if(name!=null && !name.equals("")){
buff.append(" and name like ? ");
list.add("%"+name+"%");//这个是模糊查询
}
if(age!=null && !age.equals("")){
buff.append(" and age=? ");
list.add(age);
}
...
...
...


之后就调用DAO的方法

findObjectByWhere(buff.toString(),list);
这样就行啦,不知我说明白了没有

------解决方案--------------------
11楼正解,1楼的那个思路是对的,不过查询条件要是有转移字符比如单引号就会出现问题。hibernate最好是采用11楼的动态设置参数,可以避免转义字符的问题及sql注入安全问题
------解决方案--------------------
。。。,11楼的那个list大可不不必,可以去掉
------解决方案--------------------
lz 问的可是一到面试的笔试题呀。我当时没写好,结果被pass了。
写法可以参考 《精通Hibernate》-- 11.5.1 动态查询 p332 

或者
StringBuffer hql = new StringBuffer ("select from User u where 1=1");
if (user.getTitle() != null && !user.getTitle().equals("")) {
hql.append(" and u.title like '%" + user.getTitle() + "%'");
}
if (user.getAge() != null && !user.getAge().equals("")) {
hql.append(" and u.age ='" + user.getAge() + "'");
}
return getSession().createQuery(hql.toString());