我的项目有一个小问题。 可以说,我们有一个像这样的酒店旅馆
@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,那么会有一条记录将ID为Y的旅馆与具有AC的记录联系起来)。 属性也是M:N关系,但是它具有键的评估。例如,我们具有“离海的距离”属性。而且每家酒店都有一定距离。因此,我们将“连接表”中的记录添加到离海距离为100(100m)的位置。
一个注意事项-这只是一个API。因此,它仅将json返回到frangend的Angular应用。
这就是问题所在。想象一下,用户在页面上选择了一些过滤器,假设他选择了一些酒店名称,选择了国家(相应的国家/地区ID),然后选择了一些属性和属性。 Angular将向API发送某种JSON。
可能类似于
{
name: "Hotel",
countryId: "150",
locationId: "68",
properties: {1,2,3,4},
attributes: {{1, 100}, {2,50}}
}
等(可能还有许多其他内容需要过滤)。
我想问。 使用Spring data jpa处理Thid请求的最佳方法是什么? 我正在使用诸如
这样的jpa存储库
@Repository
public interface HotelRepository extends CrudRepository<HotelEntity, Long> {
List<HotelEntity> findTop3ByCountryOrderByPriorityDesc(CountryEntity country);
}
正如您所看到的,对于一些琐碎的事情(例如优先为某些“国家/地区预览”优先安排前3家酒店的订单),这是可以的。 但是我不太确定如何很好地处理这些多值请求。
首先想到的是在某些POJO中分离过滤器,为每个JSON属性获取酒店(例如首先获取名称为“ Hotel”的所有酒店,然后使用countryID等),然后选择出现在所有这些酒店中的酒店列表。
但是这种方式(并不是我认为的)不是最好的方法,因为在同一张表中会有很多无用的查询以及可能使API变慢的许多业务逻辑。
有人可以帮助我解决这个问题吗?如何使用Spring data jpa正确,良好地处理此问题?