【问题标题】:How to search multiple field in form using Java?如何使用Java在表单中搜索多个字段?
【发布时间】:2019-12-08 12:21:27
【问题描述】:

我的应用程序搜索查询有问题。我希望能够使用表单搜索多个字段并将它们显示在表格中。表单基本上在文本字段和组合框中。请协助。这是我的代码:

当我点击搜索按钮时,错误是:

com.microsoft.sqlserver.jdbc.SQLServerException: 未为参数号 1 设置值。

btnSearch = new JButton("SEARCH");
        btnSearch.setFont(new Font("Verdana", Font.PLAIN, 13));
        btnSearch.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {

                ArrayList<Transmittal> getTransmittal;

                try{
                    Connection connection = ConnectDB.getConnection();
                    StringJoiner sj = new StringJoiner (" AND ");
                    String query = "SELECT TRANSMITTAL_ID AS \"TRANSMITTAL ID\", TRANSMITTAL_TYPE AS \"TRANSMITTAL TYPE\", TITLE, PURPOSE, ORIGINAL_TRANSMITTAL_ID AS \"TRANSMITTAL REFERENCE\","
                            + "COUNTRY, AREA, DATA_TYPE AS \"DOCUMENT TYPE\", PAC, TAPE_3590 AS \"3590\", TAPE_3592 AS \"3592\", HDD, CD, HARDCOPY, OTHERS, "
                            + "SENDER, SENDER_COMP AS \"SENDER'S COMPANY\", DATE_SEND AS \"DATE SEND\", RECEIVER, RECEIVER_COMP AS \"RECEIVER'S COMPANY\", DATE_RECEIVED AS \"DATE RECEIVED\", REMARKS, TRANSMITTAL_FILE_LINK AS \"TRANSMITTAL LINK\" "
                            + "FROM TRANSMITTAL_TABLE WHERE ";

                    List values = new ArrayList();
                    if((textFieldTransmittalID != null) && (!textFieldTransmittalID.getText().isEmpty())){
                        sj.add("TRANSMITTAL_ID LIKE ?");
                        values.add(textFieldTransmittalID);
                    }
                    if((comboBoxTType != null)  || (comboBoxTType.getItemCount() != -1)) {
                        sj.add("TRANSMITTAL_TYPE LIKE ?");
                        values.add(comboBoxTType);
                    }
                    if((textFieldTitle != null) || (!textFieldTitle.getText().isEmpty())){
                        sj.add("TITLE LIKE ?");
                        values.add(textFieldTitle);
                    }
                    if((comboBoxPurpose != null) && (comboBoxPurpose.getItemCount() != 0)){
                        sj.add("PURPOSE LIKE ?");
                        values.add(comboBoxPurpose);
                    }
                    if((textFieldTRef != null) && (!textFieldTRef.getText().isEmpty())){
                        sj.add("ORIGINAL_TRANSMITTAL_ID LIKE ?");
                        values.add(textFieldTRef);
                    }
                    if((comboBoxSender != null) && (comboBoxSender.getItemCount() != 0)){
                        sj.add("SENDER LIKE ?");
                        values.add(comboBoxSender);
                    }
                    if((textFieldSComp != null) && (!textFieldSComp.getText().isEmpty())){
                        sj.add("SENDER_COMP LIKE ?");
                        values.add(textFieldSComp);
                    }
                    if((comboBoxReceiver != null) && (comboBoxReceiver.getItemCount() != 0)){
                        sj.add("RECEIVER LIKE ?");
                        values.add(comboBoxReceiver);
                    }
                    if((textFieldRComp != null) && (!textFieldRComp.getText().isEmpty())){
                        sj.add("RECEIVER_COMP LIKE ?");
                        values.add(textFieldRComp);
                    }
                    if((textFieldRemarks != null) && (!textFieldRemarks.getText().isEmpty())){
                        sj.add("REMARKS LIKE ?");
                        values.add(textFieldRemarks);
                    }
                    if((textField3590 != null) && (!textField3590.getText().isEmpty())){
                        sj.add("TAPE_3590 LIKE ?");
                        values.add(textField3590);
                    }
                    if((textField3592 != null) && (!textField3592.getText().isEmpty())){
                        sj.add("TAPE_3592 LIKE ?");
                        values.add(textField3592);
                    }
                    if((textFieldHdd != null) && (!textFieldHdd.getText().isEmpty())){
                        sj.add("HDD LIKE ?");
                        values.add(textFieldHdd);
                    }
                    if((textFieldCd != null) && (!textFieldCd.getText().isEmpty())){
                        sj.add("CD LIKE ?");
                        values.add(textFieldCd);
                    }
                    if((textFieldOthers != null) && (!textFieldOthers.getText().isEmpty())){
                        sj.add("OTHERS LIKE ?");
                        values.add(textFieldOthers);
                    }
                    if((textFieldHardcopy != null) && (!textFieldHardcopy.getText().isEmpty())){
                        sj.add("HARDCOPY LIKE ?");
                        values.add(textFieldHardcopy);
                    }
                    if((textFieldArea != null) && (!textFieldArea.getText().isEmpty())){
                        sj.add("AREA LIKE ?");
                        values.add(textFieldArea);
                    }
                    if((textFieldPac != null) && (!textFieldPac.getText().isEmpty())){
                        sj.add("PAC LIKE ?");
                        values.add(textFieldPac);
                    }
                    if((comboBoxCountry != null) && (comboBoxCountry.getItemCount() != 0)){
                        sj.add("COUNTRY LIKE ?");
                        values.add(comboBoxCountry);
                    }
                    if((textFieldDataType != null) && (!textFieldDataType.getText().isEmpty())){
                        sj.add("DATA_TYPE LIKE ?");
                        values.add(textFieldDataType);
                    }
                    if((textFieldTLink != null) && (!textFieldTLink.getText().isEmpty())){
                        sj.add("TRANSMITTAL_FILE_LINK LIKE ?");
                        values.add(textFieldTLink);
                    }

                query += sj.toString();

                    try(PreparedStatement pst = connection.prepareStatement(query)){

                        for (int index = 1; index > values.size(); index++){
                            pst.setObject(index + 1, values.get(index));

                        }
                        try (ResultSet rs = pst.executeQuery()){

                            if (rs.next()) {

                                tableAsset.setModel(DbUtils.resultSetToTableModel(rs));

                            }
                        }
                        pst.setString(1, textFieldTransmittalID.getText());
                        pst.setString(2, comboBoxTType.getSelectedItem().toString());
                        pst.setString(3, textFieldTitle.getText());
                        pst.setString(4, comboBoxPurpose.getSelectedItem().toString());
                        pst.setString(5, textFieldTRef.getText());
                        pst.setString(6, comboBoxSender.getSelectedItem().toString());
                        pst.setString(7, textFieldSComp.getText());
                        pst.setString(8, comboBoxReceiver.getSelectedItem().toString());
                        pst.setString(9, textFieldRComp.getText());
                        pst.setString(10, textFieldRemarks.getText());
                        pst.setInt(11, Integer.parseInt(textField3590.getText()));
                        pst.setInt(12, Integer.parseInt(textField3592.getText()));
                        pst.setInt(13, Integer.parseInt(textFieldHdd.getText()));
                        pst.setInt(14, Integer.parseInt(textFieldCd.getText()));
                        pst.setInt(15, Integer.parseInt(textFieldOthers.getText()));
                        pst.setInt(16, Integer.parseInt(textFieldHardcopy.getText()));
                        pst.setString(17, textFieldArea.getText());
                        pst.setString(18, textFieldPac.getText());
                        pst.setString(19, comboBoxCountry.getSelectedItem().toString());
                        pst.setString(20, textFieldDataType.getText());
                        pst.setString(21, textFieldTLink.getText()); 

                        try (ResultSet rs = pst.executeQuery()){
                            if(rs.next()){
                        ResultSet rst = pst.executeQuery();
                        tableAsset.setModel(DbUtils.resultSetToTableModel(rst));
                            }
                        }
                    } catch(SQLException exp){
                        exp.printStackTrace();
                        JOptionPane.showMessageDialog(null, exp);
                    }
                } catch(Exception e){
                    e.printStackTrace();
                    JOptionPane.showMessageDialog(null, e);
                }




        }

        });

我希望能够在表单中搜索2或3个字段,结果应该显示在表格中。

【问题讨论】:

  • 请注意,您构建 SQL 字符串的方法对 SQL 注入相当开放。

标签: java sql eclipse jdbc


【解决方案1】:
for (int index = 1; index > values.size(); index++){
    pst.setObject(index + 1, values.get(index));
                  ^^^^^^^^^
}

在执行查询之前,此循环从不将参数设置为索引 1(错误消息告诉您的内容)。

【讨论】:

    【解决方案2】:

    在列表中,您可以使用 java 8 根据特定字段搜索特定对象

    我正在提供一个代码 sn-p

    List<Test> tests = some list;
    Test test = tests.stream().filter(testTemp -> testTemp.getSomeVal().equals("some val")&&testTemp.getOtherVal().equals("other val")))
    .findAny().
    orElse(null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-30
      • 2015-08-20
      • 2020-03-10
      • 1970-01-01
      • 2012-07-19
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多