SQL-запрос для фильтрации записи в JSP

1

Привет, этот sql-запрос не работает в некоторых условиях. Когда я пишу

query += " Price<? and Size<? and Type=?";

из инструкции if, то он работает, но когда я помещаюсь в оператор if, он не работает. И когда я пытаюсь распечатать запрос переменной, когда он находится вне инструкции if, тогда он показывает сообщение, подобное этому

select  * from products where  Price<? and Size<? and Type=?

Я не могу понять это, пожалуйста, помогите мне, это весь код '

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

    ResultSet rs;
    List<Products> data = null;
    PreparedStatement stmt;
    try {
        StringBuilder param = new StringBuilder();
        if (Brand != null) {
            for (String str : Brand) {
                param.append("'").append(str).append("', ");
            }
        }
        StringBuilder param1 = new StringBuilder();
        if (Flavour != null) {
            for (String str : Flavour) {
                param1.append("'").append(str).append("', ");
            }
        }

        String prm = param.toString().length() > 2 ? param.toString()
                .substring(0, param.toString().length() - 2) : null;
        String prm1 = param1.toString().length() > 2 ? param1.toString()
                .substring(0, param1.toString().length() - 2) : null;

        String query = "select  * from products where ";


      if(Price!=0 && Size!=0 && Type!=null && prm != null && prm1 != null)
       {
           query+="Brand in (" + prm + ") and Flavour in (" + prm1 + ") and";
            query += " Price<? and Size<? and Type=?";

        }



       System.out.println("---------------------------------------------");
           System.out.println(query);

        stmt = DataBaseConnection.DBConn.getConnection().prepareStatement(query);
        stmt.setFloat(1, Price);
        stmt.setFloat(2, Size);
        stmt.setString(3, Type);
        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();
        System.out.println("Error aa gai bhai ");
        return null;
    }
    return data;

}

Пользователь не может выбрать бренд или размер, поэтому значение любого из них может быть null поэтому я создаю разные условия if. Как достичь этого?


РЕДАКТИРОВАТЬ:

Этот код не работает, когда я не выбираю какое-либо значение из моего JSP. Я получаю NullPointerException. Это код сервлета, который вызывает мой метод:

public class My extends HttpServlet {

    /**
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
     * methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        float Price = 0, Size = 0;
        Price = Float.parseFloat(request.getParameter("Price"));
        Size = Float.parseFloat(request.getParameter("size"));
        String Type = request.getParameter("type");
        String[] Brand = request.getParameterValues("Brand");
        String[] Flavour = request.getParameterValues("Flavour");

        List<Products> data = new SessionBeanClass().Filter_Itemsl(Brand, Flavour, Price, Size, Type);
        request.setAttribute("Products", data);
        ;
        request.getRequestDispatcher("sample2.jsp").forward(request, response);
}
  • 0
    Можете ли вы опубликовать строку запроса непосредственно перед выполнением.
  • 0
    и трассировка стека, если он производит один?
Показать ещё 10 комментариев
Теги:
jdbc

2 ответа

2
Лучший ответ

Чтобы динамически строить запрос, лучше:

  • Оценивать каждую область самостоятельно
  • Имейте List<Object>, который сохранит все параметры, которые будут переданы вашему запросу.

Реализация будет выглядеть так:

List<Object> parameters = new ArrayList<>();
/*
    Parameter to evaluate:
    String[] Brand, String[] Flavour,float Price,float Size,String Type
*/
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]);
    }
    query.append(")");
}
if (Flavour != null) {
    query.append(" AND Flavour in (");
    for (int i = 0; i < Flavour .length; i++) {
        query.append('?');
        if (i < Flavour.length - 1) {
            query.append(',');
        }
        parameters.add(Flavour[i]);
    }
    query.append(")");
}
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);
}
//prepare the statement
stmt = DataBaseConnection.DBConn.getConnection().prepareStatement(query);
//append the parameters
int i = 1;
for (Object parameter : parameters) {
    stmt.setObject(i++, parameter);
}
//execute the dynamic query
rs = stmt.executeQuery();
if (rs != null) {
    //rest of your code
}

Из вашего редактирования. Проблема здесь:

Price = Float.parseFloat(request.getParameter("Price"));

Поскольку вы не отправляете данные для параметра "Цена", request.getParameter("Price") возвращает значение null. Затем исполняемым кодом будет Float.parseFloat(null), который дает NullPointerException для передачи null значения в качестве параметра.

Решение состоит в том, чтобы сохранить результат request.getParameter("Price") в переменной и оценить переменную:

String priceParameter = request.getParameter("Price");
priceParameter = (priceParameter == null) ? "0" : priceParameter.trim();
Price = Float.parseFloat(priceParameter);

Аналогичен для других переменных, которые нуждаются в преобразовании.

  • 0
    Большое спасибо за вашу помощь .. Я пытаюсь, если это работает для меня
  • 0
    ваш код не работает, сэр .. показывает исключение нулевого указателя
Показать ещё 9 комментариев
0

public class My extends HttpServlet {

/**
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
 * methods.
 *
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    float Price = 0, Size = 0;
    Price = Float.parseFloat(request.getParameter("Price"));
    Size = Float.parseFloat(request.getParameter("size"));
    String Type = request.getParameter("type");
    String[] Brand = request.getParameterValues("Brand");
    String[] Flavour = request.getParameterValues("Flavour");

    List<Products> data = new SessionBeanClass().Filter_Itemsl(Brand, Flavour, Price, Size, Type);
    request.setAttribute("Products", data);
    ;
    request.getRequestDispatcher("sample2.jsp").forward(request, response);

}

  • 0
    И трассировка стека ... Обратите внимание, что это должно быть частью вашего вопроса, а не ответа.
  • 0
    не удалось напечатать трассировку стека при ошибке
Показать ещё 23 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню