В зависимости от того, что вы используете для доступа к данным, вы можете использовать getByExample
запрос. У вас есть пример использования здесь с данными Spring. При этом вам нужно только получить пользовательский класс из API (от вашего API вы должны получить и объект для поискового запроса, этот объект должен быть несколько похож на пользовательский объект, так как параметры похожи).
И тогда, где у вас есть большой, если / иначе вы передаете объект поиска пользователя из API и в хранилище выполните getByExample
.
user = getByExample(userSearchObject)
Но это все, если вы получите в своем API только одно поле заполнил ваш объект. Это был бы наиболее разумный способ сделать это.
В противном случае я бы предложил обернуть все ваши параметры в класс в API следующим образом:
public class UserSearchQuery(){
private String param1;
private String param2;
...
//getters + setters
}
, а затем использовать критерии запроса и критерии построители запросов (статья об этом здесь ).
В вашем сервисе вам нужно будет сделать только это:
public class UserService(){
private UserRepository repository;
public User search(UserSearchQeury query){
return repository.search(query);
}
}
и в репо:
public class UserRepository(){
private EntityManager em;
public User search(UserSearchQeury query){
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> user = query.from(User.class);
List<Predicate> predicates = new ArrayList<>();
if (query.getParam1() != null) {
predicates.add(builder.equal(user.get("param1"), query.getParam1()));
}
...
// and the other ones goes here
}
}
При этом у вас будет только 1 метод поиска для вашего пользователя и не более 10 методов, по одному для каждого параметра, а для добавления критериев поиска вам всего лишь нужно добавить новый параметр в класс UserSearchQuery и добавить новый предикат. Также, если когда-нибудь вы захотите использовать несколько параметров в качестве критериев поиска, это уже будет сделано.