繁体   English   中英

如何使用Spring Boot处理不同的搜索?

[英]how to use spring boot to handle different search?

在spring boot中使用spring data jpa创建搜索功能的最佳实践是什么?

@GetMapping("/search")
public List<Hotel> getAllByCriteria(@RequestParam MultiValueMap<String, String> criteria) {
    if (criteria.containsKey("cityPublicId")) {
        String cityPublicId = criteria.getFirst("cityPublicId");
        if (criteria.containsKey("amenity")) { 
            List<String> amenities = criteria.get("amenity");
            return svc.findAllByCityAndAmenities(cityPublicId, amenities);
           }
        return svc.findAllByCity(cityPublicId);
    }
    //currently only support one amenity filtration
    else if (criteria.containsKey("amenity")) {
        return svc.findAllByAmenities(criteria.get("amenity"));
    }
    return null;
}

当前,我必须确定所有可能的准则组合才能使用相应的方法,是否存在通用的方式来处理所有情况? 或至少不对所有可能的组合进行硬编码。

PS:如果我想按多种便利条件过滤结果,是否可以使用findByAmenitiesContains(set)? 酒店实体具有一套便利设施的地方。 我必须使用@query创建自定义查询吗?

谢谢。

事后,您可以使用不同的请求有效负载实体来处理同一终结点

@GetMapping(path = "/search", params = { "cityId" })
public List<Hotel> getAllByCriteria(ByCityPublicId byCity) {
    return svc.findAllByCity(byCity.getCityPublicId())
}

@GetMapping(path = "/search", params = { "cityId", "amenity" })
public List<Hotel> getAllByCriteria(ByCityPublicIdAndAmenity byCityAndAmenitities) {
    return svc.findAllByCityAndAmenities(byCityAndAmenitities.getCityPublicId(), byCityAndAmenitities.getAmenitities())
}

@GetMapping(path = "/search", params = { "amenity" })
public List<Hotel> getAllByCriteria(ByAmenity byAmenity) {
    return svc.findAllByAmenities(byAmenity.getAmenity());
}

您基本上有以下选择:

  • 使用自定义方法从输入数据中以编程方式创建查询。 这为您提供最大的灵活性,但也需要最多的工作。

  • 使用规范 几乎相同的灵活性和几乎相同的工作量。

  • 通过示例使用查询 工作量很少,灵活性有限。

关于PS: 查询推导的功能已被详细记录

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM