Spring Data JPA多值过滤器

时间:2018-12-27 16:17:14

标签: java spring hibernate spring-data-jpa spring-data

我的项目有一个小问题。 可以说,我们有一个像这样的酒店旅馆

@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正确,良好地处理此问题?

0 个答案:

没有答案