Прежде всего, я новичок в Spring Framework и Hibernate. Пожалуйста, потерпите меня.
Я пытаюсь реализовать фильтр поиска, в котором пользователь может по желанию указать имя, фамилию, дату рождения, пол, страну, язык и т. Д. У меня есть таблица с именем Guest
, в которой хранятся эти записи. Некоторые столбцы, такие как пол, страна и язык, хранятся в отдельных таблицах с уникальными первичными ключами. Иными словами, я храню внешние ключи для этих записей в таблице Guest
.
Все поля для поиска являются необязательными. Для каждого пропущенного поля поиска программа должна принять «любой».
Имея это в виду, я могу использовать LIKE
и символы подстановки для строковых столбцов, такие как имя и фамилия. Для столбцов внешнего ключа я использую оператор =
. Если поле поиска отсутствует, оно заменяется на null
.
Я не могу получить что-либо в выводе, когда я указываю только имя (или фамилию).
Вот код для CrudRepository
интерфейса, который я написал.
public interface GuestRepository extends CrudRepository<Guest, Integer> {
@Query("SELECT guest FROM Guest guest WHERE guest.propertyIdentifier = ?1 AND guest.firstName LIKE %?2% AND guest.lastName LIKE %?3% AND guest.titleIdentifier = ?4 AND guest.dateOfBirth = ?5 AND guest.genderIdentifier = ?6 AND guest.countryIdentifier = ?7 AND guest.languageIdentifier = ?8 AND guest.passport LIKE %?9%")
Iterable<Guest> findGuests(Integer propertyIdentifier, String firstName, String lastName, Integer titleIdentifier, Date dateOfBirth, Integer genderIdentifier, Integer countryIdentifier, Integer languageIdentifier, String passport);
}
Вот сущность Guest
.
@Entity
public class Guest {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer identifier;
private Integer propertyIdentifier;
private String firstName;
private String lastName;
private Integer titleIdentifier;
@Temporal(TemporalType.DATE)
private Date dateOfBirth;
private Integer genderIdentifier;
private Integer countryIdentifier;
private Integer languageIdentifier;
private String passport;
private Integer status;
public Integer getIdentifier() {
return identifier;
}
public void setIdentifier(Integer identifier) {
this.identifier = identifier;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Date getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public String getPassport() {
return passport;
}
public void setPassport(String passport) {
this.passport = passport;
}
public Integer getLanguageIdentifier() {
return languageIdentifier;
}
public void setLanguageIdentifier(Integer languageIdentifier) {
this.languageIdentifier = languageIdentifier;
}
public Integer getCountryIdentifier() {
return countryIdentifier;
}
public void setCountryIdentifier(Integer countryIdentifier) {
this.countryIdentifier = countryIdentifier;
}
public Integer getGenderIdentifier() {
return genderIdentifier;
}
public void setGenderIdentifier(Integer genderIdentifier) {
this.genderIdentifier = genderIdentifier;
}
public Integer getTitleIdentifier() {
return titleIdentifier;
}
public void setTitleIdentifier(Integer titleIdentifier) {
this.titleIdentifier = titleIdentifier;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getPropertyIdentifier() {
return propertyIdentifier;
}
public void setPropertyIdentifier(Integer propertyIdentifier) {
this.propertyIdentifier = propertyIdentifier;
}
}
Как я могу реализовать поисковый фильтр, который предполагает «любой», если пользователь не указывает значение для поля поиска? Есть ли другие альтернативы, которые я могу использовать?