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

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

admin5小时前未来畅想4

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://www.kejiyl.com/post/6019.html

分享给朋友:

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

脑机接口技术突破

脑机接口技术突破

在当今飞速发展的科技领域中,脑机接口前沿技术正逐渐成为备受瞩目的新热点。这一技术将人类的思维与外部设备紧密相连,为我们带来了前所未有的可能性和广阔的应用前景。脑机接口,简单来说,就是通过直接读取和解析大脑的电信号或其他生物信号,来实现人与外部设备之间的交互。它就像是一座连接人类大脑与数字世界的桥梁,...

光电子领域的最新前沿技术

光电子领域的最新前沿技术

在当今飞速发展的科技领域中,光电子技术犹如一颗璀璨的新星,正引领着科技产业迈向新的高度。光电子技术以光为载体,将电子学与光学相结合,在信息传输、传感、显示等多个领域展现出了巨大的潜力和广阔的应用前景。光电子技术的前沿发展趋势之一是集成化。随着半导体工艺的不断进步,光电子器件的尺寸越来越小,集成度越来...

脑机接口娱乐在社交娱乐方面的创新应用

脑机接口娱乐在社交娱乐方面的创新应用

在当今科技飞速发展的时代,脑机接口作为一项极具潜力的前沿技术,正在悄然改变着我们的生活和娱乐方式。尤其是在社交娱乐领域,脑机接口带来了前所未有的创新应用,为人们带来了全新的体验。脑机接口娱乐在社交娱乐方面的第一个创新应用是实现了更加自然、直观的互动方式。传统的社交娱乐方式,如游戏、聊天等,往往依赖于...

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

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

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

脑机接口娱乐助力残障人士的娱乐生活

脑机接口娱乐助力残障人士的娱乐生活

在当今科技飞速发展的时代,脑机接口作为一项极具创新性的技术,正逐渐走进人们的生活,并为残障人士的娱乐生活带来了前所未有的改变。脑机接口是一种能够直接读取和解读大脑信号,并将其转化为控制外部设备或产生相应动作、感觉的技术。对于残障人士来说,这无疑是一扇通往全新娱乐世界的大门。对于肢体残障的人士而言,传...

全息投影演出艺术风格的多样化探索

全息投影演出艺术风格的多样化探索

在当今的艺术领域,全息投影技术犹如一颗璀璨的新星,正在以其独特的魅力和无限的可能性,引领着演出艺术风格的多样化探索。全息投影技术,将虚拟影像与现实空间完美融合,为观众带来前所未有的视觉震撼。它不再局限于传统的舞台表演形式,而是开启了一扇通往全新艺术世界的大门。从奇幻的仙境到未来的科技世界,从古老的神...