@Dezigned

Как сделать фильтр в виде checkbox`ов на сайте Spring?

Всем добрый вечер. В настоящее время создаю веб-приложение, в котором необходимо выводить таблицу с данными из БД, в зависимости от выбранных фильтров, примерно, как здесь:

Много читал про QueryDSL, но совсем не понимаю, как вся информация будет передаваться с сервера на сайт. Пока что все, что у меня получилось:

index.jsp
$(document).ready(function(){

            $('#comboboxCountry').on('change', function(){
                var countryId = $(this).val();
                $.ajax({
                    type: 'GET',
                    url: '${pageContext.request.contextPath }/demo/loadStatesByCountry/' + countryId,
                    success: function(result) {
                        var result = JSON.parse(result);
                        var s = '';
                        for(var i = 0; i < result.length; i++) {
                            s += '<option value="' + result[i].id + '">' + result[i].name + '</option>';
                        }
                        $('#comboboxState').html(s);
                    }
                });
            });


            $('#comboboxState').on('change', function(){
                var stateId = $(this).val();
                $.ajax({
                    type: 'GET',
                    url: '${pageContext.request.contextPath }/demo/loadCitiesByState/' + stateId,
                    success: function(result) {
                        var result = JSON.parse(result);
                        var s = '';
                        for(var i = 0; i < result.length; i++) {
                            s += '<option value="' + result[i].id + '">' + result[i].name + '</option>';
                        }
                        $('#comboboxCity').html(s);
                    }
                });
            });

            $('#comboboxCity').on('change', function(){
                var cityId = $(this).val();
                $.ajax({
                    type: 'GET',
                    url: '${pageContext.request.contextPath }/demo/loadPhenomenaByCity/' + cityId,
                    success: function(result) {
                        var result = JSON.parse(result);
                        var s = '';
                        for(var i = 0; i < result.length; i++) {
                            s += '<option value="' + result[i].id + '">' + result[i].years + '</option>';
                        }
                        $('#comboboxYears').html(s);
                    }
                });
            });


Для примера, код репозитория:

public interface PhenomenaRepository extends CrudRepository<Phenomena, Integer> {

    @Query("select distinct new com.demo.entities.PhenomenaEntity(id, years) from Phenomena where cities.id = :id")
    public List<PhenomenaEntity> findDistinctByCities(@Param("id") int id);

}


И контроллера:

@ResponseBody
    @RequestMapping(value = "loadPhenomenaByCity/{id}", method = RequestMethod.GET)
    public String loadPhenomenaByCity(@PathVariable("id") int id) {
        Gson gson = new Gson();
        return gson.toJson(phenomenaService.findDistinctByCities(id));
    }


Вот, как это выглядит:
639df146e4d92948245238.png

Все было неплохо, когда я делал Страну, регион, станцию, так как подтягивал одно из другого, но как только появилась необходимость связать год и месяц, находящиеся в одной таблице, я впал в ступор. В чем проблема: есть данные за 1970, 1974, 1984, 1984 года. События произошли в 8, 7, 8 и 8 месяцах соответственно. При всех моих попытках получалось так, что месяцы выводились только при выборе первого параметра combobox`a, а в остальных полях месяц был пустым. Так же не получается убрать повторение 1984 года (в базе хранится два происшествия, произошедших в этом году), но хотелось бы, чтобы при выборе одного просто в месяце был выбор из двух месяцев соответственно. Добавление distinct в тело запроса проблему не решило, и в checkbox`е все также выводится два поля. Для меня тяжело все это переварить, так как просто закинули в пучину и сказали сделать, ничего при этом не объяснив.

Подытоживая все, сказанное мной выше (надеюсь я хоть часть своих мыслей смог выразить внятно), мне нужно решить проблему добавления фильтров на сайт и их связывание (фильтров) между собой, а также из результата выбранных фильтров формировать таблицу с данными по полям этих фильтров. Все это должно выполняться асинхронно, поэтому, как я понимаю, без ajax`а не обойтись. JS знаю плохо от слова совсем, может поэтому возник такой вопрос. Увидел кучу примеров на JS, но не понимаю, как сделать это, подтягивая данные с сервера. Очень надеюсь на вашу помощь, так как поиск информации в течении 3ех дней ни к чему не привел. Всем спасибо.
  • Вопрос задан
  • 112 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Wan-Derer
Зобанели на Хабре, волки́ ;((
Можно использовать RequestParam - параметры адресной строки. Они могут быть разных типов. Пример из моего проекта:
@GetMapping("/list")
  List<AuditAssetItem> getChangesByCriteria(
    @RequestParam int assetid,
    @RequestParam String from,
    @RequestParam String to,
    @RequestParam boolean item,
    @RequestParam boolean rights,
    @RequestParam boolean extended
  ) {

    return service.getAuditListByCriteria(assetid, from, to, item, rights, extended);
  }

В строке браузера адрес будет выглядеть примерно так:
http : //mysite.ru/list?assetid=123&from=2020-12-01&to=2020-12-10&item=true&rights=true&extended=false

Spring разложит эти параметры по переменным в соответствии с их типами, далее ты засылаешь их в сервис и там по своей логике корректируешь запрос или пишешь несколько запросов.
Ответ написан
@Dezigned Автор вопроса
С фильтрами наконец смог разобраться, но теперь проблема немного в другом: я хочу запросом (одним) соединить несколько таблиц и вывести необходимые столбцы. После этого, в зависимости от выбранных фильтров, я хочу динамический изменять данные на странице. Пример: есть фио работников, их должности, город и т.д. При выборе города "Москва", начальная таблица будет изменяться, и в ней останутся только те работники, у кого город "Москва". То есть не ясно, как вывести все эти данные, а потом изменять их в зависимости от выбранного фильтра.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы