使用 Spring 和 specification-arg-resolver 实现 find all

Posted

技术标签:

【中文标题】使用 Spring 和 specification-arg-resolver 实现 find all【英文标题】:Implement find all with Spring and specification-arg-resolver 【发布时间】:2019-12-02 20:28:36 【问题描述】:

我想用 specification-arg-resolver 和 Spring 实现查找 Angular 的所有功能。

我正在尝试发送这个网址:

[HPM] GET /api/be/find?name=tes&login=tes&allowed_ip_address=tes&page=0&size=10

使用specification-arg-resolver实现

public Page<BeDTO> getAllBySpecification(
            @And(
                @Spec(path = "name", spec = LikeIgnoreCase.class),
                @Spec(path = "login", spec = LikeIgnoreCase.class),
                @Spec(path = "allowed_ip_address", spec = LikeIgnoreCase.class)
        ) Specification<Be> specification,
        Pageable pageable
    )         
        return merchantService.getAllBySpecification(specification, pageable)

当我将name 的参数发送到login 时,它工作正常。

但是当我发送所有 3 个参数来实现 All 搜索功能时,我什么也得不到。看来我需要一些不同的规格配置。

你知道为什么它不能正常工作吗?

进入日志我得到:

select * from merchants merchants0_ where (upper(merchants0_.name) like ?) and (upper(merchants0_.login) like ?) and (upper(merchants0_.allowed_ip_address) like ?) limit ?

【问题讨论】:

您是否尝试通过指定参数和路径来重写规范 @Spec(path="name.merchants", params="name", spec=LikeIgnoreCase.class) ? 不,你能给我举个例子吗? 1.将您的 BE 实体添加到问题中。 2. 试试这个规范:@And( @Spec(path = "name", params="name", spec = LikeIgnoreCase.class), @Spec(path = "login", params="login", spec = LikeIgnoreCase .class), @Spec(path = "allowed_ip_address", params="allowed_ip_address", spec = LikeIgnoreCase.class) 你确定数据库中有对应的行吗?代码看起来没问题,生成的查询也没问题。 是的,对于单个搜索字符串,它工作正常。 【参考方案1】:

您可以在 HQL 查询中传递名称、登录名和 ip_address,而不是使用 Specification 类。

public Page<BeDTO> getAllBySpecification(String name,String login,String ip_address,
                Pageable pageable
            )         
                return merchantService.getAllBySpecification(name,login,ip_address pageable);
            

select * from Merchants as merchants where merchants.name like %:name%  and merchants.login like %:login% and merchants.allowed_ip_address like %:allowed_ip_address%

【讨论】:

以上是关于使用 Spring 和 specification-arg-resolver 实现 find all的主要内容,如果未能解决你的问题,请参考以下文章

使用Spring Boot JPA Specification实现使用JSON数据来查询实体数据

spring data jpa Specification 复杂查询+分页查询

Spring boot中使用springfox来生成Swagger Specification小结

Spring data jpa 实现简单动态查询的通用Specification方法

spring jpa Specification 分页查询遇到的问题

Spring Data Specification 按特定字段连接