在Java中动态组装SQL查询

时间:2010-04-21 17:06:46

标签: java sql oracle dynamic-sql

动态组合带有连接条件的SQL查询的最佳方法是什么?我不想为网页或一组网页上的每个不同条件硬编码查询。它甚至可行吗?

我能够组装简单的查询,但是当我需要插入连接条件时,我感到难过,即如何找出连接的依赖关系等。

4 个答案:

答案 0 :(得分:2)

构建复杂动态查询的首选方法是:

  1. 枚举所需的所有可能的查询(即查询模式)。这使我能够看到共性并找到可以编写通用代码的模式。
  2. 分别生成SQL语句的每个部分,然后在最后连接。例如(这不是工作代码,只是一个想法的草图):
  3. <伪码>

    select_clause = 'SELECT '
    from_clause = 'FROM '
    where_clause = 'WHERE '
    orderby_clause = 'ORDER BY '
    
    if [query on person] then
      select_clause += 'p.name, p.dob '
      from_clause += 'person p '
      orderby_clause += 'p.name '
    
      if [query on address] then
        select_clause += 'a.address_text '
        from_clause += ', address a '
        where_clause += 'p.address_id = a.id AND a.id=:p1 '
      else
        where_clause += 'p.id=:p1'
      end if
    
    end if
    
    sql_stmt = select_clause + from_clause + where_clause + orderby_clause + ';'
    

    < /伪>

    因此,上面的代码可能会产生以下语句:

    SELECT p.name, p.dob
    FROM person p
    WHERE p.id=:p1
    ORDER BY p.name;
    
    SELECT p.name, p.dob, a.address_text
    FROM person p, address a
    WHERE p.address_id = a.id AND a.id=:p1
    ORDER BY p.name;
    

    使用更多参数,这种方法意味着我不必处理指数增加数量的可能标准组合。

答案 1 :(得分:1)

public String AssembleSimpleSelectQuery(String TableName,Hashtable<String,String> criteria) {
    Hashtable<String,String> columnlist = ReturnColumnList(TableName);
    Iterator<String> iter = columnlist.keySet().iterator();
    int count = 0;
    query=new StringBuilder();
    query.append("SELECT ");
    while(iter.hasNext())
    {
        count++;
        query.append(iter.next());
        if(count < (columnlist.size()))
        {
            query.append(",");
        }
    }
    query.append(" From " + TableName );


    Iterator<String> crit = criteria.keySet().iterator();
    if(criteria.size()>0)
    {
        query.append(" where ");
    }
    count = 0;
    while(crit.hasNext())
    {
        count++;
        String temp = crit.next();
        query.append(temp + "=");
        if(columnlist.get(temp).equals("String") || columnlist.get(temp).equals("Id"))
        {
            query.append("'" + criteria.get(temp) + "'");
        }
        else if(columnlist.get(temp).equals("Date"))
        {
            query.append("to_date('"+criteria.get(temp)+"','mm-dd-yyyy')");
        }
        if(count < criteria.size())
        {
            query.append(" and ");
        }
    }
    return query.toString();
}

/ 这是创建简单选择查询的示例函数 --i调用returncolumnlist,它从存储表名及其列的xml文件中读取,并返回列名及其数据类型的哈希表.... - 我还没想出如何在这个代码中加入一个连接条件(可能超过1)...所以寻找想法......我不寻找代码... /

答案 2 :(得分:0)

您可以使用iBatis。它有一个名为Dynamic SQL的功能。有了这个,您可以根据几个条件在运行时创建动态查询。

答案 3 :(得分:0)

Hibernate有API来构建查询而不必连接字符串,请参见:

http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Criteria.html