У меня небольшая проблема в моем проекте.Допустим, у нас есть объект под названием 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?