Я хотел бы создать поиск, в котором пользователь определяет условия предложенияwhere. Если пользователь вводит параметр в форму поиска, этот параметр включается в предложение WHERE. Если параметр оставлен пустым, он исключается из предложенияwhere. Если вся форма пуста, запрос должен вернуть SELECT ALL и всю таблицу. Таким образом, запрос становится тем более точным, чем больше параметров вводит пользователь.
Я пробую приведенный ниже код, но, похоже, он требует ввода параметров и возвращает результаты только в том случае, если фактические данные совпадают со ВСЕМИ указанными предикатами. Похоже, что предикаты включаются в массив, даже если они имеют значение NULL и пусты? Либо так, либо я упускаю что-то очень очевидное в том, как я это написал.
Мои вопросы:
1) Если форма поиска останется пустой, будут ли предикаты исключены из массив?
2) Если да, не будет ли запрос по умолчанию ВЫБРАТЬ ВСЕ? [query.from(Contacts.class)]?
Я видел аналогичный вопрос, но не сказал мне, как добиться вышеизложенного, поскольку кажется, что логика моего кода правильна.
JPA, где есть пункты
Заранее благодарим за любые рекомендации!
public ListDataModel qSearchContacts(String firstName, String surName, Integer countryid, Integer companyId) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(Contacts.class);
Root cont = query.from(Contacts.class);
query.select(cont);
List predicateList = new ArrayList();
Predicate firstnamePredicate, surnamePredicate, countryPredicate, companyPredicate;
if ((firstName != null) && (!(firstName.isEmpty()))) {
firstnamePredicate = cb.like(cb.upper(cont.get("firstName")), "%" + firstName.toUpperCase() + "%");
predicateList.add(firstnamePredicate);
}
if ((surName != null) && (!(surName.isEmpty()))) {
surnamePredicate = cb.like(cb.upper(cont.get("surName")), "%" + surName.toUpperCase() + "%");
predicateList.add(surnamePredicate);
}
if (countryid != null) {
Join country = cont.join("country");
countryPredicate = cb.equal(country.get("countryid"), countryid);
predicateList.add(countryPredicate);
}
}
if (companyId != null) {
Join company = cont.join("company");
companyPredicate = cb.equal(company.get("companyId"), companyId);
predicateList.add(companyPredicate);
}
Predicate[] predicateArray = new Predicate[predicateList.size()];
predicateList.toArray(predicateArray);
query.where(predicateArray);
ListDataModel contactResultList = new ListDataModel(em.createQuery(query).getResultList());
return contactResultList;
}
Подробнее здесь: https://stackoverflow.com/questions/309 ... e-conditio
Создайте расширенный поиск в JPA с помощью определяемых пользователем динамических условий предложения. ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение