【问题标题】:how to use spring boot to handle different search?如何使用spring boot来处理不同的搜索?
【发布时间】:2017-11-23 03:20:02
【问题描述】:

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

@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 创建自定义查询吗?

谢谢。

【问题讨论】:

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


    【解决方案1】:

    你基本上有以下几种选择:

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

    • Use a specification。几乎相同的灵活性和几乎相同的工作量。

    • Use query by example。工作量很少,灵活性有限。

    关于PS:The capabilities of query derivation are well documented

    【讨论】:

    • 请问如何通过示例查询处理整数?然后给定的链接只处理字符串。
    • 同理。你只是不能指定匹配的类型,因为它只做等于匹配。
    【解决方案2】:

    AFAIR 你可以使用不同的请求负载实体来处理同一个端点

    @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());
    }
    

    【讨论】:

    • 这与在一种方法中创建'if'基本相同。我想知道我是否可以为相同的请求参数获取多个值,例如2个便利设施。如果可能,链接地址是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2019-01-18
    • 2014-01-03
    • 2022-12-20
    相关资源
    最近更新 更多