Необязательные критерии Spring JPA-фильтра в методе Query - PullRequest
1 голос
/ 11 мая 2019

Я хочу отфильтровать данные из базы данных по нескольким критериям (предположим, что это 8).И ниже метод запроса сделать это хорошим способом.Но на самом деле этот критерий, передаваемый методу запроса, может быть нулевым (это означает, что его не следует включать в запрос выбора).

Как мне справиться с этой ситуацией?Я действительно не хочу делать n-методы для каждого случая - это не очень хороший способ.

@Query("SELECT NEW api.model.GeneralAnnouncementInfo(" +
        "an.id, an.title, po.price, SUBSTRING(an.description, 1, 100), an.provider, an.creationDate, an.url, l.lessorType, concat(loc.city, ' ', loc.district)) " +
        "FROM Announcement as an " +
        "LEFT JOIN an.priceOffer as po " +
        "LEFT JOIN an.lessor as l " +
        "LEFT JOIN an.location as loc " +
        "LEFT JOIN an.propertyData as pd " +
        "WHERE l.lessorType = (:lessor) " +
        "AND pd.roomNumber = (:rooms) " +
        "AND pd.bathroomNumber = (:baths) " +
        "AND pd.parkingAvailability = (:parking) " +
        "AND pd.isSmokingAllowed = (:smokers) " +
        "AND pd.isPetFriendly = (:pets) " +
        "AND pd.area = (:realPrice) " +
        "AND po.price = (:area) ")
Page<GeneralAnnouncementInfo> getAnnouncementsBySearchCriteria(Pageable pageable, 
                                                               String lessor,
                                                               String rooms,
                                                               String baths,
                                                               String parking,
                                                               String smokers,
                                                               String pets,
                                                               String realPrice,
                                                               String area
);

1 Ответ

2 голосов
/ 11 мая 2019

Я бы рекомендовал перейти на JPA Criteria API .Это даст вам дополнительную гибкость, которую вы ищете (и которая, как представляется, JPQL максимально подходит для вашего случая).Вы можете создавать свои запросы программно без каких-либо ограничений, и самое лучшее, что они компилируются;это означает, что никакие опечатки не выживут (что является кошмаром для отслеживания в запросах JPQL).Кроме того, вы можете использовать классы метамоделей JPA ;которые добавляют больше надежности вашим запросам.В конце ваш метод хранилища будет выглядеть примерно так:

private EntityManager em;

private Page<GeneralAnnouncementInfo> getAnnouncementsBySearchCriteria(QueryParameters qParams) {
    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<SampleEntity> criteria = cb.createQuery(GeneralAnnouncementInfo.class);
    Root<GeneralAnnouncementInfo> root = criteria.from(GeneralAnnouncementInfo.class);

    // Programmatically build query details (conditions, joins, aggregations, translation, etc) 
    // ...
    // ...
    // ...


    return em.createQuery(criteria).getResultList();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...