我想实现一个多条件查询数据库的方法。该方法接收一个对象,如果该对象字段有值则进入选择条件,如果没有则排除。使用sql语言可以这样实现。
SELECT Id, Name, Age, ClassID, Sex, Rark
FROM stu
WHERE   (Id=@a or @a is null)and(Name =@c or @c is null)
只要id或者name两个字段中有一个有条件就可以选择这个条件,如果两个条件都为null那么就是全部选择。但是如何在java当中实现呢?
我试着这样实现
 public ArrayList selectArr(biao obj) {
        Connection conn = DbConn.sql(); //获得连接对象
        PreparedStatement pst = null; //说明sql语句执行对象,该对象可使用参数
        ArrayList arr = new ArrayList();
        try {
            pst = conn.prepareStatement(
                    "SELECT * FROM [test] WHERE  (Name=? or ? is null")and(Id=?or ?is null);
            pst.setString(1, obj.getName()); //给参数赋值
            pst.setString(2, obj.getName());
           pst.setString(3, obj.id());
           pst.setString(4, obj.id());
           ResultSet rs = pst.executeQuery(); //执行查询
              }
        catch(){}
}但是结果并不成功。主要是字段为空时不知道为什么不能满足“?is null”条件。各位知道为什么这样吗?有什么解决的办法?另外请教大家对于多条件查询有什么高招没有?

解决方案 »

  1.   

    楼上,多写条件?能说详细些吗?
    使用上面的sql语句可以自动判断条件参数@a和@c是否存在,如果该参数不存(为null)在就忽略它。这个在查询分析器中已经验证可行。我这里设想用户界面中有很多查询条件可以输入,如果用户输入一个条件,则查询这个条件。如果输入多个则查询多个,如果不输入,则查询全部。用对象将查询对象接收然后传入这个查询方法。对象中所有的字段都可以作为查询条件。传入的对象的字段如果有值则将该值作为条件,如果没有值就忽略。但是使用PreparedStatement 的?参数输入,就无论如何都不能识别该字段是否为null。只有or前面的条件起作用。另外不知道java是否支持对sql语句中的"@a"这样的参数赋值?如果可以对sql语句的参数赋值那个这个问题就好解决啦。
      

  2.   

    你这样去写这样的复杂的sql语句是很不科学的,其实你的那些判定条件可以在java代码里面去实现
      

  3.   

    楼上是说用拼接字符串吗?那种方法我用过,其实也很繁琐。使用比较复杂的sql语句就是为了减小java语言的复杂程度,使java的可读性提高。我甚至都想过用存储过程来实现这个查询。呵呵,不过还是要谢谢楼上两位。刚刚我原样从新敲啦一边代码居然就可以正常运行了。没有搞懂。。
    真是神奇的java!!!!
      

  4.   

    String   s1=codeToString(request.getParameter( "keyword ")); 
    String   sql= "select   *   from   student_info "; 
    String   searchtype=codeToString(request.getParameter( "searchtype ")); 
    String   s=codeToString(request.getParameter( "ziduan ")); 
    if(s.equals( "xh ")) 

                if(searchtype.equals( "jq ")) 
                { 
                        sql=sql+ "   where   txtnumber   =   ' "+s1+ " ' "   ; 
                } 
                else 
              { 
                          sql=sql+ "   where   txtnumber   like   '% "+s1+ "% ' ";} 
                } 

    if(s.equals( "xy ")) 

              if(searchtype.equals( "jq ")) 
              { 
                      sql=sql+ "   where   txtinstitute= ' "+s1+ " ' "; 
              } 
              else 
              { 
                      sql=sql+ "   where   txtinstitute   like   '% "+s1+ "% ' ";} 
              } 

    if(s.equals( "xm ")) 
    {   
            if(searchtype.equals( "jq ")) 
            { 
                    sql=sql+ "   where   txtname= ' "+s1+ " ' "; 
            } 
            else 
            { 
                    sql=sql+ "   where   txtname   like   '% "+s1+ "% ' ";} 
              } 
    }
      

  5.   

    好老的帖子啊,不过我现在才看到,刚刚做题的时候想到的用三目运算符的方法解决多条件查询问题,我这个是在查询数据库的背景下用的public void queryService(String name1,String name2,String name3,String name4,Date name5){
    String sql = "select * from emp where"; //基础语句,下面的都是可选择的
    String sql1 = " and name1 = ?";          
    String sql2 = " and name2 = ?";
    String sql3 = " and name3 = ?";
    String sql4 = " and name4 = ?";
    String sql5 = " and name5 = ?";

    String sqlyes = sql+(name1==null?"":sql1)+(name2==null?"":sql2)
    +(name3==null?"":sql3)+(name4==null?"":sql4)+(name5==null?"":sql5);
           }传参的时候,为空的字段参数直接用null代替