当前位置:首页 > 未来畅想 > 正文内容

requestgetattribute map Spring Boot 用一个接口搞定所有查询

admin9小时前未来畅想5

requestgetattribute map Spring Boot 用一个接口搞定所有查询

如果你用过 Boot,一定很熟悉“铁三角”:@、@ 和 @。每加一个实体,通常就会有对应的 来处理 CRUD 和业务逻辑——至少对于同步操作来说如此。

requestgetattribute map Spring Boot 用一个接口搞定所有查询 第1张

创建 POST、PUT、 这些接口很简单:校验、业务逻辑一接,接口就能用了。

但 GET 呢?

来看一个简单的 实体:

public class Employee extends BaseUUIDEntity {
    private Long id;
    private String name;
    private String email;
    private String mobile;
    private String role;
    private String status;
    private String address;
}

现在我们要查所有指定状态的员工requestgetattribute map,很简单:

@GetMapping
public List getEmployeesByStatus(@RequestParam String status) {
    return employeeRepository.findByStatus(status);
}

清爽利落requestgetattribute map Spring Boot 用一个接口搞定所有查询,对吧?

我们继续下一个需求:

“API 能不能也按角色过滤?”

当然可以,改一下:

@GetMapping
public List getEmployeesByStatusAndRole(@RequestParam String status,
                                                  @RequestParam String role) {
    return employeeRepository.findByStatusAndRole(status, role);
}

又一次上线、又一次版本号递增。

然后又有同事说:

“我们想按 或 role 查询,还能不能加个 过滤?”

糟了,问题来了:组合太多,维护太累。

# Data 登场

提供了一种动态、可复用的方式,用 JPA API 构建查询。

可以把 理解为运行时构建 的工具requestgetattribute maprequestgetattribute map Spring Boot 用一个接口搞定所有查询,让你对查询条件有极高的灵活性。

我们来用 搭一个灵活的查询解析器。

#动态搜索构建器

public  Specification parseSearchParams(MultiValueMap params) {
    return (root, query, criteriaBuilder) -> {
        List predicates = new ArrayList<>();
        for (Map.Entry> param : params.entrySet()) {
            String key = param.getKey();
            List values = param.getValue();
            if (key.equals("page") || key.equals("size") || key.equals("sort")) {
                continue; // 跳过分页/排序参数
            }
            try {
                Path path = root.get(key);
                if (values.get(0).startsWith("in:")) {
                    String[] valuesArray = values.get(0).substring(3).split(",");
                    List trimmedValues = Arrays.stream(valuesArray)
                            .map(String::trim)
                            .collect(Collectors.toList());
                    predicates.add(path.in(trimmedValues));
                    continue;
                }
                for (String value : values) {
                    if (value.startsWith("eq:")) {
                        predicates.add(criteriaBuilder.equal(path, value.substring(3)));
                    } else if (value.startsWith("like:")) {
                        predicates.add(criteriaBuilder.like(path.as(String.class), "%" + value.substring(5) + "%"));
                    } else if (value.startsWith("gt:")) {
                        predicates.add(criteriaBuilder.greaterThan(path.as(String.class), value.substring(3)));
                    } else if (value.startsWith("gte:")) {
                        predicates.add(criteriaBuilder.greaterThanOrEqualTo(path.as(String.class), value.substring(4)));
                    } else if (value.startsWith("lt:")) {
                        predicates.add(criteriaBuilder.lessThan(path.as(String.class), value.substring(3)));
                    } else if (value.startsWith("lte:")) {

                        predicates.add(criteriaBuilder.lessThanOrEqualTo(path.as(String.class), value.substring(4)));
                    }
                }
            } catch (Exception e) {
                log.error("创建 {}:{} 的谓词出错", key, values, e);
            }
        }
        return predicates.isEmpty()
                ? criteriaBuilder.conjunction()
                : criteriaBuilder.and(predicates.toArray(new Predicate[0]));
    };
}

#最终 API 接口

@GetMapping
public List getEmployees(@RequestParam MultiValueMap params) {
    Specification spec = parseSearchParams(params);
    return employeeRepository.findAll(spec);
}

#查询示例

现在,这一个接口就能支持所有这些用例:

# 查找所有在职员工
curl -X GET "http://localhost:8080/api/employees?status=eq:ACTIVE"
# 查找所有角色包含 manager 的在职员工
curl -X GET "http://localhost:8080/api/employees?status=eq:ACTIVE&role=like:manager"
# 查找指定角色的员工
curl -X GET "http://localhost:8080/api/employees?role=in:Manager,Engineer"

#为什么值得这样做

这种模式可以轻松适配任何实体,让你的代码库保持一致性和可维护性。

一个接口,无限查询。如果没有复杂业务逻辑requestgetattribute map,这就是最终答案。

加入微信交流群:************ ,请猛戳这里→点击入群

扫描二维码推送至手机访问。

版权声明:本文由前沿科技娱乐汇发布,如需转载请注明出处。

本文链接:https://kejiyl.com/post/6019.html

分享给朋友:

“requestgetattribute map Spring Boot 用一个接口搞定所有查询” 的相关文章

前沿技术在教育中的应用

前沿技术在教育中的应用

在当今飞速发展的时代,前沿科技正以令人瞩目的方式打破着教育产业的边界,为教育带来了前所未有的变革与机遇。人工智能(AI)在教育领域的应用堪称是打破边界的先锋力量。通过机器学习算法,AI 可以根据每个学生的学习特点和进度,提供个性化的学习路径和内容推荐。例如,智能辅导系统能够实时分析学生的答题情况,迅...

脑机接口娱乐蕴含的创新教育意义

脑机接口娱乐蕴含的创新教育意义

在当今科技飞速发展的时代,脑机接口这一前沿领域逐渐走进人们的视野。它不仅在医疗、事等领域展现出巨大的潜力,其在娱乐领域的应用也引发了广泛的关注。而脑机接口娱乐所蕴含的创新教育意义,更是值得我们深入探讨和挖掘。脑机接口娱乐为教育提供了全新的交互方式。传统的教育模式主要依赖于键盘、鼠标等输入设备,而脑机...

太空旅游娱乐:从梦想照进现实的历程

太空旅游娱乐:从梦想照进现实的历程

在人类的历史长河中,太空一直是一个充满神秘与幻想的领域,而太空旅游娱乐则如同夜空中最璀璨的星辰,逐渐从遥远的梦想照进了现实。追溯到古代,人类就对太空充满了向往,从嫦娥奔月的神话传说到万户飞天的悲壮尝试,无不展现着人类对太空的渴望。在那个科技相对落后的时代,这些梦想只能停留在想象之中。随着现代科技的飞...

太空旅游娱乐的独特美食体验畅想

太空旅游娱乐的独特美食体验畅想

当我们踏上太空旅游的征程,那将是一场前所未有的冒险与体验。而在这浩瀚宇宙之中,美食也将迎来全新的变革,展现出独特而令人惊叹的一面。想象一下,在失重的太空中,美食的呈现方式将完全颠覆我们的传统认知。传统的餐具将变得不再适用,取而代之的是轻巧而便捷的太空食品包装。这些包装设计精巧,既能保证食品的新鲜与卫...

全息投影演出色彩搭配的艺术魅力

全息投影演出色彩搭配的艺术魅力

在当今的艺术领域中,全息投影技术以其独特的魅力和震撼力,成为了一种备受瞩目的表现形式。而色彩搭配作为全息投影演出的重要元素之一,更是展现出了无尽的艺术魅力,给观众带来了一场场视觉盛宴。色彩是人类感知世界的重要方式之一,它能够直接影响人们的情绪和感受。在全息投影演出中,色彩搭配的运用可以营造出各种不同...

脑机接口娱乐与智能家居娱乐集成

脑机接口娱乐与智能家居娱乐集成

在当今科技飞速发展的时代,娱乐领域也迎来了前所未有的变革。脑机接口娱乐与智能家居娱乐的集成,仿佛为我们打开了一扇通往未来娱乐世界的大门,将带给我们前所未有的体验和惊喜。脑机接口娱乐,作为一项极具创新性的技术,它能够直接读取和解读人类大脑的信号,将思维转化为实际的操作和互动。想象一下,只需通过意念的控...