Фильтр многозначных значений jpa данных Spring - PullRequest
0 голосов
/ 27 декабря 2018

У меня небольшая проблема в моем проекте.Допустим, у нас есть объект под названием hotel, подобный этому

@Entity
@Table(name = "hotel")
@JsonIdentityInfo(
        generator = ObjectIdGenerators.PropertyGenerator.class,
        property = "id"
)
public class HotelEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    @Getter
    @Setter
    private long id;

    @Column(name = "name")
    @Getter
    @Setter
    private String name;

    @ManyToOne(cascade= {CascadeType.PERSIST, CascadeType.MERGE,
            CascadeType.DETACH, CascadeType.REFRESH},
    fetch = FetchType.EAGER)
    @JoinColumn(name = "country_id")
    @JsonBackReference
    @Getter
    @Setter
    private CountryEntity country;

    @OneToOne
    @JoinColumn(name = "location_id")
    @Getter
    @Setter
    private LocationEntity location;


    @OneToMany(mappedBy = "hotel")
    @Getter
    @Setter
    private List<HotelAttributeRecordEntity> attributes;

    @ManyToMany(mappedBy = "hotels", fetch = FetchType.EAGER)
    @Getter
    @Setter
    private List<HotelPropertyEntity> properties;

//some other code that is not relevant in our case
}

Почти все свойства «понятны по типу», но позвольте мне рассказать вам, в чем разница между списком свойств и списком атрибутов.Свойство является просто типичным отношением M: N.(Так что если в отеле есть AC, есть запись, соединяющая отель с идентификатором Y с записью с AC).Атрибутами также является отношение M: N, но оно имеет оценку связи.Например, у нас есть атрибут «расстояние от моря».И в каждом отеле есть какое-то расстояние.Поэтому мы добавляем запись в «соединительную таблицу» расстояния от моря со значением 100 (100 м).

Одно примечание - это всего лишь API.Таким образом, он возвращает только json в приложение Angular на fronend.

И это проблема.Представьте себе, пользователь выбирает какой-то фильтр на странице, скажем, он выбирает какое-то название отеля, выбирает страну (соответствующий идентификатор страны), он выбирает некоторые атрибуты и свойства.Angular отправит какой-то JSON в API.

Это может быть что-то вроде

{
name: "Hotel",
countryId: "150",
locationId: "68",
properties: {1,2,3,4},
attributes: {{1, 100}, {2,50}}
}

и т. Д.(может быть много других вещей для фильтрации).

Я хотел бы спросить. Каков наилучший подход для обработки запроса thid с использованием Spring data jpa? Я использую репозитории jpa, такие как

@Repository
public interface HotelRepository extends CrudRepository<HotelEntity, Long> {
    List<HotelEntity> findTop3ByCountryOrderByPriorityDesc(CountryEntity country);
}

И, как вы можете видеть, для некоторых тривиальных вещей (таких как получение первых 3отели в порядке приоритета для некоторых "Country Preview") все в порядке.Но я не совсем уверен, как правильно обрабатывать этот запрос с несколькими значениями.

Первой мыслью было разделить фильтр в некотором POJO, найти отели для каждого отдельного объекта JSON (например, сначала получить все отели с именем).", затем с идентификатором страны и т. д. и т. д.) и выберите отели, которые присутствуют во всех этих списках.

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

Может кто-нибудь помочь мне с этой проблемой?Как правильно и красиво решить эту проблему, используя Spring data jpa?

...