Фильтр в TableView при нажатии на кнопку

Есть TableView куда при открытии приложения загружаются данные из таблицы patient.

В классе DAO создал метод, который будет выбирать записи по параметрам.

public class PatientDao {

    public List<Patient> findPatientsWithParams(String fam, String im, String ot) {
        List<Patient> patientList = (List<Patient>) HibernateSessionFactoryUtil.getSessionFactory().openSession()
                .createQuery("from Patient where fam like:fam or im like:im or ot like:ot")
                .setParameter("fam", fam)
                .setParameter("im", im)
                .setParameter("ot", ot)
                .setMaxResults(100)
                .list();
        return patientList;
    }
    
        public List<Patient> findAllPatients() {
        List<Patient> patientList = (List<Patient>) HibernateSessionFactoryUtil.getSessionFactory().openSession().createQuery("From Patient").list();
        return patientList;
    }
}

Есть класс сервис, где вызывается метод из DAO

public class PatientService {

    private PatientDao patientDao = new PatientDao();

    private ObservableList<Patient> patients = FXCollections.observableArrayList();

    public PatientService() {

    }

    public ObservableList<Patient> getPatients() {
        return patients;
    }

    public void fillPatientsList() {
        patients.addAll(patientDao.findAllPatients());
    }

    public void findPatientsWithParams(String f, String i, String o) {
        patients.addAll(patientDao.findPatientsWithParams(f, i, o));
    }
}

В классе контроллер пытаюсь реализовать поиск, вроде получилось, но есть ощущение что можно реализовать получше. Есть более нормальный способ?

public class MainController {
    private Stage mainStage;

    PatientService patientService = new PatientService();

    private FilteredList<Patient> filteredList;

    SortedList<Patient> sortedList;

    @FXML private TableView<Patient> tabPatient; //Грид для отображения пациентов
    @FXML private TableColumn<Patient, String> fieldPatFam; //Поле для грида пациентов
    @FXML private TableColumn<Patient, String> fieldPatIm;//Поле для грида пациентов
    @FXML private TableColumn<Patient, String> fieldPatOt;//Поле для грида пациентов
    @FXML private TableColumn<Patient, Date> fieldPatBdate;//Поле для грида пациентов

    @FXML private TextField txtFieldFam;
    @FXML private TextField txtFieldIm;
    @FXML private TextField txtFieldOt;

    @FXML private Button btnSearchPatient;

    public void setMainStage(Stage mainStage) {
        this.mainStage = mainStage;
    }

    public void initialize() {
        workPatientsGrid();
        showPatientGrid();
    }

    private void showPatientGrid() {
        fieldPatFam.setCellValueFactory(new PropertyValueFactory<Patient, String>("fam"));
        fieldPatIm.setCellValueFactory(new PropertyValueFactory<Patient, String>("im"));
        fieldPatOt.setCellValueFactory(new PropertyValueFactory<Patient, String>("ot"));
        fieldPatBdate.setCellValueFactory(new PropertyValueFactory<Patient, Date>("bdate"));

        sortedList = new SortedList<Patient>(filteredList);

        sortedList.comparatorProperty().bind(tabPatient.comparatorProperty());

        tabPatient.setItems(sortedList);
    }

    private void workPatientsGrid() {
        patientService.fillPatientsList();
        filteredList = new FilteredList<Patient>(patientService.getPatients(), patient -> true);
    }

    private void searchPatient() {
        filteredList.setPredicate(patient -> {
            if (patient.getFam().toLowerCase().contains(txtFieldFam.getText().trim().toLowerCase()) && patient.getIm().toLowerCase().contains(txtFieldIm.getText().trim().toLowerCase()) && patient.getOt().toLowerCase().contains(txtFieldOt.getText().trim().toLowerCase())) {
                System.out.println(filteredList.size());
                return true;
            }
            return false;
        });
    }

    public void onActionPatient(ActionEvent actionEvent) {
        searchPatient();
    }
}

Нужно так: Если в поля Фамилия, Имя, Отчество ввели данные и по ним нашлись записи, то отобразить только их, если нет, то ничего не выводить. Если ввели данные только в одно поле и по этому полю нашлись данные тоже отобразить те записи, которые удовлетворяют условию. Не пойму как нормально этого добиться.


Ответы (0 шт):