【问题标题】:Dynamic Sql qyery using prepare statement使用准备语句的动态 Sql 查询
【发布时间】:2014-07-11 06:49:20
【问题描述】:

您好,我想为过滤产品创建一个动态查询。我想从 PRODUCTS 表中过滤产品 基于某些参数,如

  1. 品牌
  2. 风味
  3. 价格
  4. 尺寸
  5. 类型 我正在创建一个正在执行 MySQL 查询的函数,我想检查哪个参数用户使用了哪个参数,这些值不会为空,其余未选择的参数将为空。所以我正在检查不是 null 的函数,并将它们传递给查询 我试过下面的代码 但它显示带有以下消息的空指针执行

您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法

你尝试打印查询:

SELECT * FROM products WHERE 1=1 AND brand in (?,? AND Price

以下是代码:

public List<Products> Filter_Itemsl(String[] Brand, String[] Flavour, float Price, float Size, String Type) {

    List<Object> parameters = new ArrayList<Object>();
    ResultSet rs;
    List<Products> data = null;
    PreparedStatement stmt;

    try {
        StringBuilder query = new StringBuilder("SELECT * FROM products WHERE 1=1");
        if (Brand != null) {
            query.append(" AND brand in (");
            for (int i = 0; i < Brand.length; i++) {
                query.append('?');
                if (i < Brand.length - 1) {
                    query.append(',');
                }
                parameters.add(Brand[i]);
            }
        }
        if (Flavour != null) {
            query.append(" AND Flavour in (");
            for (int i = 0; i < Brand.length; i++) {
                query.append('?');
                if (i < Flavour.length - 1) {
                    query.append(',');
                }
                parameters.add(Flavour[i]);
            }
        }
        if (Price != 0) {
            query.append(" AND Price < ?");
            parameters.add(Price);
        }
        if (Size != 0) {
            query.append(" AND Size < ?");
            parameters.add(Size);
        }
        if (Type != null) {
            query.append(" AND Type = ?");
            parameters.add(Type);
        }
        String Query = query.toString();
        System.out.println(Query);

        stmt = DataBaseConnection.DBConn.getConnection().prepareStatement(Query);

        int i = 1;
        for (Object parameter : parameters) {
            stmt.setObject(i++, parameter);
        }

        rs = stmt.executeQuery();
        if (rs != null) {
            data = new ArrayList<Products>();
            while (rs.next()) {
                Products p = new Products();
                p.setTitle(rs.getString("Ttile"));
                p.setCategory(rs.getString("Category"));
                p.setSubCategory(rs.getString("SubCategory"));
                p.setSubCategoryTwo(rs.getString("SubCategorytwo"));
                p.setPrice(rs.getInt("Price"));
                p.setFlavour(rs.getString("Flavour"));
                p.setSize(rs.getFloat("Size"));
                p.setImage(rs.getString("image"));
                p.setBrand(rs.getString("Brand"));
                p.setInstock(rs.getString("instock"));
                p.setInstockQty(rs.getInt("instockqty"));
                p.setType(rs.getString("Type"));
                data.add(p);
            }

        }

    } catch (Exception e) {
        System.out.println(e.getStackTrace());
        System.out.println("----------------------");
        System.out.println(e.getMessage());
        System.out.println("----------------------");
        System.out.println(e.getSuppressed());
        System.out.println("----------------------");
        e.printStackTrace();

        return null;
    }
    return data;

}

【问题讨论】:

  • 当使用IN 关键字时,您使用打开的( 大括号开始子句,但我没有看到结束该子句的) 大括号。解决这个问题,您的查询应该可以正常工作。
  • MySQL 服务器版本的正确语法在 ')'ultimate Nutrition',)'Dymatize Elite whey') AND Price
  • 条件为真
  • 另外,确保parameters 是一个链表而不是arrayList 以维护参数顺序
  • 您似乎在每个参数之后添加),所以它最终会像这样:IN (param1,)param2,),但它只需要像这样添加在末尾:IN (param1, param2)。只需在 for 循环后添加 )

标签: java mysql jsp jdbc prepared-statement


【解决方案1】:

你需要在for循环之后关闭括号

if (Flavour != null) {
        query.append(" AND Flavour in (");
        for (int i = 0; i < Brand.length; i++) {
            query.append('?');
            if (i < Flavour.length - 1) {
                query.append(',');
            }
            parameters.add(Flavour[i]);
        }
       query.append(")");
    }

【讨论】:

  • 当我选择所有参数或少数参数时,你能帮我看看我的查询是否正常
【解决方案2】:

您缺少每个 IN sql 语句的结束 )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2020-05-03
    • 1970-01-01
    • 2013-08-30
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多