Пример JPA - создание динамического запроса c - Spring Boot - PullRequest
0 голосов
/ 02 мая 2020

У меня есть контроллер метода, который будет возвращать все рекламные объявления, которые фильтруются с помощью переданных paremetrs.

@GetMapping("/search/advertisements")
    public List<Advertisement> getSpecicShortAdvertisements(
            @RequestParam(value = "city", required = false) String city,
            @RequestParam(value = "category", required = false) AdvertisementCategory category) {
        return shortAdvertisementService.getSpecificShortAdvertisements(city,category);
    }

Так, например, это может быть: http://localhost:8080/search/advertisements?city=WARSZAWA&category=ANIMALSCARE

, но также может быть http://localhost:8080/search/advertisements?category=ANIMALSCARE Если я не отправляю никаких параметров, он должен вернуть все рекламные объявления.

Было бы так сложно написать запрос для каждого параметра, поэтому я использовал Example, но не знаю, почему он все время возвращает пустой список, несмотря на наличие данных в БД.

добавляется для каждого запуска приложения (начальные данные)

advertisementRepository.save(Advertisement.builder()
                .advertisementCategory(AdvertisementCategory.ANIMALSCARE)
                .dateTime(LocalDateTime.now())
                .description("LAAAAAAAAAAAAAAAAAAA")
                .featured(false)
                .photos(null)
                .title("TiTitle 2tle 1")
                .city("KRAKOW")
                .build());

        advertisementRepository.save(Advertisement.builder()
                .advertisementCategory(AdvertisementCategory.ANIMALSCARE)
                .dateTime(LocalDateTime.now())
                .description("LAAAAAAAAAAAAAAAAAAALA" +
                        "AALAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAALAAAAA" +
                        "AAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAALAAAAAAAAAAAAAAAAAAA")
                .featured(false)
                .photos(null)
                .title("TTitle 2Title 2Title 2itle 2")
                .city("WARSZAWA")
                .build());

Чтобы вы могли видеть, отправляю ли я 'WARSZAWA' в качестве города, оно должно вернуть это объявление, но ничего не возвращает.

Метод обслуживания:

public List<Advertisement> getSpecificShortAdvertisements(String city, AdvertisementCategory category) {
        Advertisement example = Advertisement.builder()
                .advertisementCategory(category)
                .city(city)
                .build();

        return advertisementRepository.findAll(Example.of(example));
    }

Репо:

@Repository
public interface AdvertisementRepository extends JpaRepository<Advertisement, Long> {

}

// РЕДАКТИРОВАТЬ

SQL генерируется:

select advertisem0_.advertisementid as advertis1_0_, advertisem0_.advertisement_category as advertis2_0_, advertisem0_.city as city3_0_, advertisem0_.date_time as date_tim4_0_, advertisem0_.description as descript5_0_, advertisem0_.featured as featured6_0_, advertisem0_.title as title7_0_ from advertisement advertisem0_ where advertisem0_.featured=? and advertisem0_.advertisementid=0 and advertisem0_.city=?

Если я сделал

public List<Advertisement> getSpecificShortAdvertisements(String city, AdvertisementCategory category) {
        ExampleMatcher exampleMatcher = ExampleMatcher.matchingAny();

        Advertisement example = Advertisement.builder()
                .advertisementCategory(category)
                .city(city)
                .build();

        return advertisementRepository.findAll(Example.of(example, exampleMatcher));
    }

затем он возвращает все, несмотря на отправку http://localhost:8080/search/advertisements?city=LALA, которая не должна совпадать с чем-либо

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