采用的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根本无关,还请大虾们不要拍砖。

解决方案 »

  1.   

    无所谓啊。创建一个对象,把参数set到对象里面就可以了。
              你也可以进行判断,没有就执行这个,有就执行那个。不就可以了。
      

  2.   

    多谢楼上回复,还不是很明白,能否给个具体的示例看看。
    比如我也想这样,
    List<Criterion> list = new ArrayList<Criterion>();
    if(userName!=null){
    list.add(a);
    }
    if(userAge!=null){
    list.add(b);
    }
    现在我不能直接把list当参数传到queryManagers里面去,应该怎么样做个转换?queryManagers这个方法是不能修改的。
      

  3.   

    可以用一个Map来保存查询参数, 然后在Manager实现类中遍历Map中的参数并创建Criteria.
      

  4.   

    Criteria criteria = session.createCriteria(Cat.class);
    for(String key : map.keySet()) {
      if(key.equals("name")) { criteria.add(Expression.eq(map.get(name));}
      else if (key.equals("age")) {}
      ...
    }
      

  5.   


    if(userName!=null){
      criteria.add(Restrictions.eq("userName",userName));
    }if(userAge!=null){
      criteria.add(Restrictions.eq("userAge",userAge));
    }managerList = managerService.queryManagers(criteria);
      

  6.   

    5楼的代码很好,不过我在action里是没有session这个对象的。我这个session只能在dao层获得。
      

  7.   

    那就用DetaichedCriteria,不要用Criteria.
      

  8.   

    各位达人先息怒:)
    可能是我没有说清楚,首先我要说5楼的代码是没有问题的的,但前提是我能在我的web层获取到session这个对象,但是session这个对象我只能在dao层去获取,而不是web层,所以在这里不能用。其实我的意思是这样的,我最初用一个对象来保存所有查询的参数组合,比如一楼所说的通过一系列的类似于list的add方法将所有参数都add进去以后,再把这个对象转换成我需要的Criterion... criterion这种格式。就好比javascript数组用join(",")转换成用逗号分割的对象。然后将这些用逗号分割的对象传到queryManagers这个方法里面去、
      

  9.   

    用一种很纠结的方法实现了,如下:
    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楼的代码是最方便的。
      

  10.   

    为什么 不用键值对 存储啊  有数据的存储数据 没数据的存储null 你取的时候 你想要哪个就取哪个
      

  11.   


    不清楚为什么要和session有什么关系。
    在action中将参数封装到离线查询(DetachedCriteria)中,
    将DetachedCriteria传给Service就ok.DetachedCriteria查询是不需要Session的.