Dynamic Sql qyery using prepare statement
我想创建一个动态查询来过滤产品。我要从"产品"表中过滤产品
根据某些参数,例如
- 牌
- 味道
- 价钱
- 尺寸
- 类型
我正在创建一个函数,在其中我正在执行MySQL查询,我想检查用户使用了哪个参数,使用了哪些参数,这些值将不为null,其余未选择的参数为null。所以我正在检查为null的函数,并在查询中传递它们
我尝试了以下代码
但它显示带有以下消息的空指针执行
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
,您尝试打印查询:
SELECT * FROM products WHERE 1=1 AND brand in (?,? AND Price < ? AND Size < ? AND Type = ?
下面的代码是:
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服务器版本,用于在')'最终营养',)'Dymatize优质乳清')附近使用正确的语法,并且在第1行的价格<4000.0 AND尺寸<4.0'如果我关闭括号,这是错误的提示
- 为条件为真
- 另外,确保parameters是链表而不是arrayList,以保持参数顺序
- 您似乎在每个参数之后添加了),所以它最终像这样:IN (param1,)param2,),但只需要像这样在最后添加:IN (param1, param2)。只需在for循环后添加)。
- 问题已解决,但是当我传递所有参数的值时它可以工作,但是如果我跳过任何参数则它不起作用为什么?
- 检查空字符串。例如if(!("").equals(Flavor) && Flavor != null) 除了空检查
- java.lang.IndexOutOfBoundsException:索引:0,大小:0 \\ tjava.util.ArrayList.rangeCheck(ArrayList.java:635)我试过了,但是现在给出了这个异常
- @ user3660263 ArrayList还维护数据的顺序。也许您将它与HashSet混淆了。
- @ user748316 Flavor是一个数组,由于将字符串与数组进行比较,因此检查"".equals(Flavor)完全无关。
您需要在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(")");
}
- 当我选择所有参数或少数几个参数时,可以帮我解决我的查询问题吗
您缺少每个IN sql语句的结尾)。