现在需做一个查询。
比如有3个条件。
1,2,3
if(1!=null||2!=null||3!=null)
 {
  if(1!=null||2!=null)
 {
  .....
 }else if(1!=null||3!=null)
  {
    ...
  }else if(2!=null||3!=null){
   .........
  }else if(1){
   ..........
  }else if(2){
   ........
  }else if(3){
   .........
 }
}
有三个条件只能这么判断吗?
1,2,3
1,2
1,3
2,3
1
2
3如果我有10个条件呢?
是不是就要写
1,2,3,4,5,6,7,8,9,10晕,那就大了,有什么好办法,大家给支个招

解决方案 »

  1.   

    1,
    select * from sys_menu where parent_name like'1';
    如果2等于空,执行2的话那就直接查询不出来了。
    1,2
    select * from sys_menu where parent_name like'1' and neme like'2';
    select * from sys_menu where parent_name like'1' and neme like'2' and 123 like'3';
    ....
      

  2.   

    if(1!=null||2!=null||3!=null)
     {
      if(1!=null||2!=null)
     {
      .....
     }else if(1!=null||3!=null)
      {
        ...
      }else if(2!=null||3!=null){
       .........
      }else if(1){
       ..........
      }else if(2){
       ........
      }else if(3){
       .........
     }
    }
    难道我就不能避免这种判断?有没有好办法?
    如果有N种我怎么写。
      

  3.   

    这样啊,你把条件做成一个查询类
    public List<T> getListByQuery(Object query)
    throws IllegalAccessException, IllegalArgumentException {
    // TODO Auto-generated method stub
    if (query == null) {
    return this.getList();
    } else {
    String queryString = prepareQueryString(query);
    return getHibernateTemplate().find(queryString);
    }
    } /**
     * 利用反射机制返回查询字符串
     * 
     * @param query
     *            查询参数
     * @return 查询字符串
     */
    protected String prepareQueryString(Object query)
    throws IllegalAccessException, IllegalArgumentException {
    StringBuffer sb = new StringBuffer();
    if(query == null){
    return "from " + type.getName();
    }else{
    Class tempClass = query.getClass();
    sb.append("from ");
    sb.append(type.getName() + " as _qc");
    sb.append(" where 1=1");
    Field[] fields = tempClass.getDeclaredFields();
    for(Field f : fields){
    if(f.get(query) != null){
    sb.append(" and _qc.");
    sb.append(f.getName() + " like '");
    sb.append(f.get(query) + "%'");
    }
    }
    }
    return sb.toString();
    }
    }
    这个是我以前写得,用的反射,其中的type声明为
    Class<T> type;
    public class BaseDaoHibernate<T, PK extends Serializable> extends
    HibernateDaoSupport implements BaseDao<T, PK> { private Class<T> type; public BaseDaoHibernate(Class<T> type) {
    this.type = type;
    } /*
     * (non-Javadoc)
     * 
     * @see edu.zsu.fbfz.clic.dao.BaseDao#create(java.lang.Object)
     */
    public PK create(T newInstance) {
    return (PK) getHibernateTemplate().save(newInstance);
    } /*
     * (non-Javadoc)
     * 
     * @see edu.zsu.fbfz.clic.dao.BaseDao#delete(java.lang.Object)
     */
    public void delete(T transientObject) {
    getHibernateTemplate().delete(transientObject);
    } /*
     * (non-Javadoc)
     * 
     * @see edu.zsu.fbfz.clic.dao.BaseDao#read(java.io.Serializable)
     */
    public T read(PK id) {
    return (T) getHibernateTemplate().get(type, id);
    } /*
     * (non-Javadoc)
     * 
     * @see edu.zsu.fbfz.clic.dao.BaseDao#update(java.lang.Object)
     */
    public void update(T transientObject) {
    getHibernateTemplate().update(transientObject);
    } public List<T> getList() {
    // TODO Auto-generated method stub
    String className = type.getName();
    return (List<T>) getHibernateTemplate().find("from " + className);
    } public List<T> getListByQuery(Object query)
    throws IllegalAccessException, IllegalArgumentException {
    // TODO Auto-generated method stub
    if (query == null) {
    return this.getList();
    } else {
    String queryString = prepareQueryString(query);
    return getHibernateTemplate().find(queryString);
    }
    } /**
     * 利用反射机制返回查询字符串
     * 
     * @param query
     *            查询参数
     * @return 查询字符串
     */
    protected String prepareQueryString(Object query)
    throws IllegalAccessException, IllegalArgumentException {
    StringBuffer sb = new StringBuffer();
    if(query == null){
    return "from " + type.getName();
    }else{
    Class tempClass = query.getClass();
    sb.append("from ");
    sb.append(type.getName() + " as _qc");
    sb.append(" where 1=1");
    Field[] fields = tempClass.getDeclaredFields();
    for(Field f : fields){
    if(f.get(query) != null){
    sb.append(" and _qc.");
    sb.append(f.getName() + " like '");
    sb.append(f.get(query) + "%'");
    }
    }
    }
    return sb.toString();
    }
    }
      

  4.   

    能不能用HashMap呢?
    Map<String, Object> map=new HashMap<String, Object>();
    String sql = " from TableName where 1=1";
    if(第一个条件成立){
    map.put("字段名",值);
    }
    if(第N个条件成立){
    map.put("字段名",值);
    }
    if(map !=null && map.size()>0){
    Object key, value;
    Iterator it = map.entrySet().iterator();
    while (it.hasNext()) {
    Map.Entry entry = (Map.Entry) it.next();
    key = entry.getKey();
    value = entry.getValue();
    sql+=" and " + key + "=" + value;
    }
    最后招待:sql语句!
    }
      

  5.   

    能不能用HashMap呢?
    Map<String, Object> map=new HashMap<String, Object>();
    String sql = " from TableName where 1=1";
    if(第一个条件成立){
    map.put("字段名",值);
    }
    if(第N个条件成立){
    map.put("字段名",值);
    }
    if(map !=null && map.size()>0){
    Object key, value;
    Iterator it = map.entrySet().iterator();
    while (it.hasNext()) {
    Map.Entry entry = (Map.Entry) it.next();
    key = entry.getKey();
    value = entry.getValue();
    sql+=" and " + key + "=" + value;
    }
    最后招待:sql语句!
    }
    ----------------------------------------------
    但是这样的话,如果你需要增加一个条件,不是还要多写一个if么?用反射的话只要在查询的类里面加一个字段就可以了
      

  6.   

    请问Class<T> type; 这是什么语法啊?