public List getMembersByConditions(Long minAge, Long maxAge, String gender,
String provincecity,int start,int end) throws Exception {
Session session = HibernateSessionFactory.getSession();
List list = null;
String str = "from MemberInfo where 1=1";
if(minAge!=null && maxAge!=null) {
str = str +" and age between "+minAge+" and "+maxAge; 

}
if(!gender.equals("unlimited")) {
if(gender.equals("0")) {
str = str+" and gender='0'";
}else {
str = str+" and gender='1'";
}
}
if(!provincecity.equals("unlimited")) {
str = str +" and provinceCity="+provincecity;
}
Query query = session.createQuery(str+"order by nickName");
query.setFirstResult(start);
query.setMaxResults(end);
list = query.list();
return list;
}

解决方案 »

  1.   

    谢谢kunmingkunlun!
    我看你代码,还是先判断,再追加。有没有好的解决办法?
      

  2.   

    可以用query by example,
    具体讲(以查user为例, user有name、 age 、pwd等属性)
    比如已知name 和 age,查这个user,
    那么可以构建一个user(作为查询用到的example,注意这里不需要判断name、age是否为空,直接可以赋值)
    User user = new User();
    use.setName(xxx);...Example example = Example.create(user);
    Criteria criteria = session.createCriteria(User.class).add(example);
    这样可能符合你的要求。
      

  3.   

    谢谢 forestking_xx!
    我想再问一个问题:在hibernate执行HQL查询时,都是利用From POJO,即将POJO的属性全部列出来;尤其是多张表进行连接查询时,它将所有POJO的属性全部列出来了。我觉得这样比较损耗性能。有没有方法来指定属性?即我不需要全部查询出来,只显示几个重要的属性?
                    谢谢!
      

  4.   

    1 首先是可以的, 但是要加上select,比如select user.name, user.age from User user
    2 你不必担心搜出全部属性会影响性能,事实上,在from POJO时hibernate并没有搜出全部的属性,而只是取出了id,而qita的属性在使用的时候才会被拿出来。
      

  5.   

    哦,非常感谢forestking_xx!
    谢谢!结贴了。
      

  6.   

    forestking_xx,您好,就Hibernate example的查询一个小问题向您咨询。
    example在处理日期比较怎么做?即我要查询为brithday大于'2008-04-22'和小于'2008-04-23'的记录,用
    example怎么做?谢谢!
      

  7.   

    象这种动态条件的情况一般用 QBC 语言查询
      

  8.   

    呵呵,楼上的方法好,在此之前我一直通过OO设计来解决这个问题,下次做项目再用hibernate试下QBC.