Как реализовать поисковый фильтр с помощью Spring + Hibernate + MySQL? - PullRequest
0 голосов
/ 02 ноября 2018

Прежде всего, я новичок в 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;
    }
}

Как я могу реализовать поисковый фильтр, который предполагает «любой», если пользователь не указывает значение для поля поиска? Есть ли другие альтернативы, которые я могу использовать?

1 Ответ

0 голосов
/ 02 ноября 2018

Рассмотрите возможность использования Критерии API . Это будет выглядеть примерно так:

@Service
public class GuestService {

@PersistenceContext
private EntityManager em;

public List<Guest> findGuests(Guest searchedGuest) {

    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Guest> cq = cb.createQuery(Guest.class);
    Root<Guest> quest = cq.from(Guest.class);
    List<Predicate> predicates = new ArrayList<Predicate>();

    if (searchedGuest.getPropertyIdentifier != null) {
        predicates.add(cb.equal(quest.get("propertyIdentifier"), searchedGuest.getPropertyIdentifier));
    }
    if (searchedGuest.getFirstName != null) {
        predicates.add(cb.like(quest.get("firstName"), "%" + searchedGuest.getFirstName + "%"));
    }
    // other predicates

    cq.select(quest).where(predicates.toArray(new Predicate[] {}));
    List<Guest> guests = em.createQuery(cq).getResultList();
    return guests;
}

Где seekGuest - ваш объект с необязательно заполненными полями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...