Фильтр поиска для Jtable - PullRequest
       3

Фильтр поиска для Jtable

0 голосов
/ 14 октября 2018

У меня есть набор «Рамка для встреч» для врачей, внутри которого есть «Записи пациентов» и, конечно же, доктор, а затем у меня есть поле поиска, поэтому, когда я нахожу некоторых врачей, мне просто нужно искать их имя, ошибки нет.но проблема в том, что когда поле поиска пусто, jtable заполняется всем пользователем, включая администратора медсестры и т. д.

, и это мой код

try{
        String like = DoctorSearch.getText();
        String sql = "Select ID,First_Name,[M.I],Last_Name from User_Table\n" +
                     "where Role_ID = 3 AND Last_Name LIKE '"+like+"%' or First_Name LIKE '"+like+"%'";
        pst = conn.prepareStatement(sql);
        rs = pst.executeQuery();
        DoctorNames.setModel(DbUtils.resultSetToTableModel(rs));
    }catch(Exception e){
        JOptionPane.showMessageDialog(null, e);
    }finally {
        try {
            rs.close();
            pst.close();
        }catch(Exception e){

        }
    }

Но когда я удаляю

First_Name LIKE '"+like+"%'

он делает правильно, что я могу сделать, чтобы сделать это правильно?

1 Ответ

0 голосов
/ 14 октября 2018

Это все, что связано с приоритетом операторов.Допустим, вы ищете «Джеймс». Фактический код SQL, который вы пытаетесь выполнить, таков:

Select ID,First_Name,[M.I],Last_Name from User_Table
where Role_ID = 3 AND Last_Name LIKE 'James'
or First_Name LIKE 'James'

Теперь из-за приоритета операторов SQL , ГДЕраздел обрабатывается как:

WHERE (Role_ID = 3 AND Last_Name LIKE 'James')
OR (First_Name LIKE 'James')

Таким образом, вы получите всех врачей, чьи фамилии «Джеймс», и всех (включая медсестер), чьи имена «Джеймс».И когда ваше поле поиска будет пустым, вы получите всех, чьи имена LIKE '', то есть все.

Чтобы бит Role_ID = 3 применялся в обоих случаях, вам просто нужны скобкивот так:

Select ID,First_Name,[M.I],Last_Name from User_Table
where Role_ID = 3 AND (Last_Name LIKE 'James'
or First_Name LIKE 'James')

Итак, ваш код будет выглядеть так:

    String sql = "Select ID,First_Name,[M.I],Last_Name from User_Table\n" +
                 "where Role_ID = 3 AND ( Last_Name LIKE '"+like+"%' or First_Name LIKE '"+like+"%')";

Однако ...

Вы также делаете что-то действительно плохое здесь.Вы настраиваете себя на то, что называется атакой SQL-инъекции.Прочтите об этом и о том, как вы должны предоставить ? в SQL, где вы хотите указать свое значение, а затем заменить его на что-то вроде setString() после того, как вы вызвали conn.prepareStatement(sql).Это очень, очень важно.

В целом, вы, вероятно, получите что-то вроде:

    String sql = "Select ID,First_Name,[M.I],Last_Name from User_Table\n" +
                 "where Role_ID = 3 AND (Last_Name LIKE ? or First_Name LIKE ?)";
    pst = conn.prepareStatement(sql);
    pst.setString(1, like);
    pst.setString(2, like);
    rs = pst.executeQuery();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...