【发布时间】:2014-07-11 06:49:20
【问题描述】:
您好,我想为过滤产品创建一个动态查询。我想从 PRODUCTS 表中过滤产品 基于某些参数,如
- 品牌
- 风味
- 价格
- 尺寸
- 类型 我正在创建一个正在执行 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