首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring不推荐使用Specifications<T>类型

Spring不推荐使用Specifications<T>类型
EN

Stack Overflow用户
提问于 2019-07-19 12:15:30
回答 1查看 7.3K关注 0票数 2

我正在实现来自链接:Spring Data - Multi-column searches的逻辑,在这里我希望通过FirstName进行搜索。

As链接:https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/domain/Specifications.html

EmployeeSpecification.java

代码语言:javascript
复制
public class EmployeeSpecification {
    public static Specification<Employee> textInAllColumns(String text) {
        if (!text.contains("%")) {
            text = "%" + text + "%";
        }
        final String finalText = text;

        return new Specification<Employee>() {
            @Override
            public Predicate toPredicate(Root<Employee> root, CriteriaQuery<Employee> cq, CriteriaBuilder builder) {
                return builder.or(root.getModel().getDeclaredSingularAttributes().stream().filter(a -> {
                    if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                        return true;
                    } else {
                        return false;
                    }
                }).map(a -> builder.like(root.get(a.getName()), finalText)).toArray(Predicate[]::new));
            }
        };
    }
}

EmployeeRepository.java

代码语言:javascript
复制
public interface EmployeeRepository extends JpaRepository<Employee, Long>{
    List<Employee> findAll(Specification<Employee> spec);
}

EmployeeServiceImpl.java

代码语言:javascript
复制
@Service
@Slf4j
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeRepository employeeRepository;

    @Override
    public void findAllCustomersByFirstName(String firstName) {
        employeeRepository.findAll(Specifications.where(EmployeeSpecification.textInAllColumns(firstName)));
    }
}

错误:

这一行中的多个标记-类型规范中的(规格)不适用于参数(规范)的方法-不推荐类型规范

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-19 13:00:27

您的回购代码需要像这样扩展JpaSpecificationExecutor

代码语言:javascript
复制
public interface EmployeeRepository extends JpaRepository<Employee, Long>, 
    JpaSpecificationExecutor<Employee> {
}

JpaSpeficationExecutor有以下方法可以调用:

代码语言:javascript
复制
public interface JpaSpecificationExecutor<T> {
    Optional<T> findOne(@Nullable Specification<T> var1);

    List<T> findAll(@Nullable Specification<T> var1);

    Page<T> findAll(@Nullable Specification<T> var1, Pageable var2);

    List<T> findAll(@Nullable Specification<T> var1, Sort var2);

    long count(@Nullable Specification<T> var1);
}

然后你就可以:

代码语言:javascript
复制
public void findAllCustomersByFirstName(String firstName) {
    employeeRepository.findAll(
            EmployeeSpecification.textInAllColumns(firstName)
    );
}

我更改了您的规范,使用lambdas:

代码语言:javascript
复制
public class EmployeeSpecification {
    public static Specification<Employee> textInAllColumns(String text) {
        if (!text.contains("%")) {
            text = "%" + text + "%";
        }
        final String finalText = text;

        return  (Specification<Employee>) (root, query, builder) -> 
                builder.or(root.getModel().getDeclaredSingularAttributes().stream().filter(a -> {
                if (a.getJavaType().getSimpleName().equalsIgnoreCase("string")) {
                    return true;
                } else {
                    return false;
                }
            }).map(a -> builder.like(root.get(a.getName()), finalText)).toArray(Predicate[]::new));
    }
}

您可以在这里查看您在回答中拥有的代码的更新版本:https://github.com/zifnab87/spring-boot-rest-api-helpers/blob/26501c1d6afcd6afa8ea43c121898db85b4e5dbe/src/main/java/springboot/rest/specifications/CustomSpecifications.java#L172

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57112319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档