Фильтр в 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();
}
}
Нужно так: Если в поля Фамилия, Имя, Отчество ввели данные и по ним нашлись записи, то отобразить только их, если нет, то ничего не выводить. Если ввели данные только в одно поле и по этому полю нашлись данные тоже отобразить те записи, которые удовлетворяют условию. Не пойму как нормально этого добиться.