Hibernate 在中使用CriteriaBuilder进行JPA查询

Hibernate 在中使用CriteriaBuilder进行JPA查询,hibernate,spring-data-jpa,Hibernate,Spring Data Jpa,这是我第一次在这里发帖寻求帮助,如果这是一件非常愚蠢的事情,我很抱歉,但我已经尝试了一些我发现的代码,但它根本不起作用 在我们的应用程序中,我们使用单个字符串来过滤状态,但新的需求需要将其更改为列表。这里的限制是,我们试图使用旧方法实现向后兼容性,并使FE更容易与我们集成 我的问题是,是否可以使用criteriaBuilder.in()来使用列表过滤这些内容 在这里,我发布了我们BE中的规范 public Page<ReturnObject> findAll(final Pa

这是我第一次在这里发帖寻求帮助,如果这是一件非常愚蠢的事情,我很抱歉,但我已经尝试了一些我发现的代码,但它根本不起作用

在我们的应用程序中,我们使用单个字符串来过滤状态,但新的需求需要将其更改为列表。这里的限制是,我们试图使用旧方法实现向后兼容性,并使FE更容易与我们集成

我的问题是,是否可以使用criteriaBuilder.in()来使用列表过滤这些内容

在这里,我发布了我们BE中的规范

    public Page<ReturnObject> findAll(final Pageable pageable, final GetRequest request) {
        final Specification<ReturnObject> specification =
                Specification.where(ReturnObjectSpecs.getFeNameSpec(request.getFeName())
                        .and(ReturnObjectSpecs.getIdSpec(request.getId()))
                        .and(ReturnObjectSpecs.getUserIdSpec(request.getUserId()))
                        .and(ReturnObjectSpecs.getStatusSpec(request.getStatus())));

        return sessionRepository.findAll(specification, pageable);
    }
publicpagefindall(最终可分页,最终获取请求){
最终规范=
规范.where(ReturnObjectSpecs.getFeNameSpec(request.getFeName())
.and(ReturnObjectSpecs.getIdSpec(request.getId()))
.and(ReturnObjectSpecs.getUserIdSpec(request.getUserId()))
和(ReturnObjectSpecs.getStatusSpec(request.getStatus());
返回sessionRepository.findAll(规范,可分页);
}
这里是criteriaBuilder的上一个规范

    static Specification<ReturnObject> getStatusSpec(final String status){
        return (root, query, criteriaBuilder) -> StringUtils.isEmpty(status)?
                criteriaBuilder.isTrue(criteriaBuilder.literal(true)):
                criteriaBuilder.equal(root.get("status"), status);
    }
静态规范getStatusSpec(最终字符串状态){
return(root、query、criteriaBuilder)->StringUtils.isEmpty(状态)?
criteriaBuilder.isTrue(criteriaBuilder.literal(true)):
criteriaBuilder.equal(root.get(“status”)、status);
}
下面是我尝试用该列表进行查询的结果

    static Specification<ReturnObject> getStatusSpec(final List<String> status) {
        return (root, query, criteriaBuilder) -> {
            if (status.isEmpty()) {
                return criteriaBuilder.isTrue(criteriaBuilder.literal(true));
            } else {
                Expression<String> expression = root.get("status");
                expression.in(status);
                return criteriaBuilder.in(expression);
            }
        };
    }
静态规范getStatusSpec(最终列表状态){
返回(根、查询、准则生成器)->{
if(status.isEmpty()){
返回criteriaBuilder.isTrue(criteriaBuilder.literal(true));
}否则{
表达式=root.get(“状态”);
在(身份)中的表达;
返回criteriaBuilder.in(表达式);
}
};
}
这是我们的实际模型

public class GetRequest {
    private Long id;
    private Long userId;
    private List<String> status;

    //Getters and setters are ignored 
}

public类GetRequest{
私人长id;
私有长用户ID;
私人名单状态;
//getter和setter被忽略
}

感谢您的帮助

这应该可以正常工作:

返回root.get(“status”).in(status)
主题外

criteriaBuilder.isTrue(criteriaBuilder.literal(true))
可以替换为

criteriaBuilder.and()
依照

创建给定限制谓词的连接零谓词的连接为真。