采用的spring+hibernate架构,现在我在service层定义了这么个方法(用来根据已知条件查询数据库)
public List<Manager> queryManagers(Criterion... criterion)我在web层如下调用是没有问题的(根据传进来的用户名和年龄查询用户)
managerList = managerService.queryManagers(Restrictions.eq("userName", userName),Restrictions.eq("userAge", userAge));现在问题来了,因为userName和userAge这个传递进来参数可能有也可能没有,所以上面写法可能就会是
managerList = managerService.queryManagers(Restrictions.eq("userName", userName));
也可能会是
managerList = managerService.queryManagers(Restrictions.eq("userAge", userAge));因此我想把多个查询参数用一个类似于list这样的对象来存储,应该怎么修改?也许这个问题跟hibernate根本无关,还请大虾们不要拍砖。
public List<Manager> queryManagers(Criterion... criterion)我在web层如下调用是没有问题的(根据传进来的用户名和年龄查询用户)
managerList = managerService.queryManagers(Restrictions.eq("userName", userName),Restrictions.eq("userAge", userAge));现在问题来了,因为userName和userAge这个传递进来参数可能有也可能没有,所以上面写法可能就会是
managerList = managerService.queryManagers(Restrictions.eq("userName", userName));
也可能会是
managerList = managerService.queryManagers(Restrictions.eq("userAge", userAge));因此我想把多个查询参数用一个类似于list这样的对象来存储,应该怎么修改?也许这个问题跟hibernate根本无关,还请大虾们不要拍砖。
你也可以进行判断,没有就执行这个,有就执行那个。不就可以了。
比如我也想这样,
List<Criterion> list = new ArrayList<Criterion>();
if(userName!=null){
list.add(a);
}
if(userAge!=null){
list.add(b);
}
现在我不能直接把list当参数传到queryManagers里面去,应该怎么样做个转换?queryManagers这个方法是不能修改的。
for(String key : map.keySet()) {
if(key.equals("name")) { criteria.add(Expression.eq(map.get(name));}
else if (key.equals("age")) {}
...
}
if(userName!=null){
criteria.add(Restrictions.eq("userName",userName));
}if(userAge!=null){
criteria.add(Restrictions.eq("userAge",userAge));
}managerList = managerService.queryManagers(criteria);
可能是我没有说清楚,首先我要说5楼的代码是没有问题的的,但前提是我能在我的web层获取到session这个对象,但是session这个对象我只能在dao层去获取,而不是web层,所以在这里不能用。其实我的意思是这样的,我最初用一个对象来保存所有查询的参数组合,比如一楼所说的通过一系列的类似于list的add方法将所有参数都add进去以后,再把这个对象转换成我需要的Criterion... criterion这种格式。就好比javascript数组用join(",")转换成用逗号分割的对象。然后将这些用逗号分割的对象传到queryManagers这个方法里面去、
String userAge = getRequest().getParameter("age");
String userName = getRequest().getParameter("name");
List<Criterion> criterionList = new ArrayList<Criterion>();
if(userName !=null && userName != ""){
criterionList.add(Restrictions.eq("userName", userName));
}
if(userAge !=null && userAge != ""){
criterionList.add(Restrictions.eq("userAge", Integer.parseInt(userAge)));
}
//将ArrayList转化为Array,如果我java在熟悉点,早就想到了,哈
Criterion[] Criterions = (Criterion[])criterionList.toArray(new Criterion[criterionList.size()]);再次说明一下,因为在web层不能获取session对象,不然5楼的代码是最方便的。
不清楚为什么要和session有什么关系。
在action中将参数封装到离线查询(DetachedCriteria)中,
将DetachedCriteria传给Service就ok.DetachedCriteria查询是不需要Session的.