表Info结构
id (int)
year (int)
month (int)
day (day)
name (varchar)
想做个模糊查询,查询条件有可能年月日都为空,或者只填年或者月,
如果hql写成 select * from info where year like '%?%' and month like '%?%' and day like '%?%' and name like '%?%'的话。假如条件只填了月份,比如查询1月,就连11月也查出来了。唉。
如果写成select * from info where year =? and month =? and day =? and name like '%?%',如果查询时年月日为空,那就查不出东西了,该如何去调整这SQL语句?

解决方案 »

  1.   

     用select * from info where year like '%?%' and month like '%?%' and day like '%?%' and name like '%?%'在判断一下长度 
      

  2.   

    只填月份的话,为什么把其他的HQL语句拼装上去?
      

  3.   

    我都感觉你这不是模糊查询吧
    这样判断试试
    String sql="select * from info where 1=1"
    if(年不是空){
       sql+="and year =?";
    }
    if(月不是空){
       sql+="and month =?";
    }
    if(日不是空){
       sql+="and day =?";
    }
    你是要这个效果么?
      

  4.   

    感谢wangfeis,目前我也是用这种方法,判断年月日是否为空。
    年月日可能有不同的组合: 
    可能是全部都空;
    可能是年 or 月 or 日 or (年+月) or (月+日),后台用HQL,这几组不同组合搞得后台代码比较多,我想有没办法直接在mysql查询时就解决到
      

  5.   

    或者不是用户输入,而是选择,用<select>
      

  6.   

    SELECT * FROM oneself WHERE name like '%'
    like 是模糊查询的关键字。
    % 是通配符,代表多个任意匹配,比如 '%人民' 就是搜索前半段是任意字符,结尾是人民的记录,类似的可以将 % 放在条件字段的任意位置。
    _ 是单个字符的统配符,可以匹配单个任意字符。PHP 不需要像你这样写,双引号中出现的变量将自动被解析。
    $sql = "SELECT * FROM oneself WHERE name like '%{$colname_Recordset1}' LIMIT {$startRow_Recordset1}, {$maxRows_Recordset1}";
    $Recordset1 = mysql_query($sql) or die(mysql_error());{} 放在变量两边是直接指明这是个变量及该变量的名字,如果遇到数组类型的变量效果比较明显,不然可能会造成数组型变量名解析出错。
      

  7.   

    把 and 变成 or。
    逻辑上就可以了。
      

  8.   

    在hql里面加入if判断是否为空,如果为空怎样。
    或者更一般的做法是在用一个日历控件放在text里面直接进行选择
      

  9.   

    String sql="select * from info where 1=1" 
    if(年不是空){ 
      sql+="and year =?"; 

    if(月不是空){ 
      sql+="and month =?"; 

    if(日不是空){ 
      sql+="and day =?"; 
    }
    if(name不是空)
      sql+= "name like '%?%' "就可以了啊   模糊查询就是那样子
      

  10.   

    StringBuffer sql="select * from info where 1=1" 
    if(year!=null){ 
      sql.append("and year like '%?%'");

    if(month!=null){ 
      sql.append(" or month like '%?%'"); 

    if(day!=null){ 
      sql.append(" or day like '%?%');

    if(name!=null) 
      sql.append(" or name like '%?%'");//注意前面的空格,最后toString()就行了就可以了啊  模糊查询就是那样子 
      

  11.   

    可以用StringBuffer实现,先StringBuffer str=new StringBuffer("select * from info where id!='');
    再判断不为空就追加